📄 ptp_state.c
字号:
if(g_USBImage.image_cmd.Parameter1 == DREQUEST_DPS)
{
PTP_CONTAINER *data = (PTP_CONTAINER *)g_USBImage.dps_request_tx_data;
g_USBImage.state = PTP_RESPONSE;
data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + g_USBImage.send_xml_size;
data->ContainerType = USB_IMAGE_DATA_BLOCK;
data->Code = PTP_GET_OBJECT;
data->TransactionID = g_USBImage.current_transactionID;
g_USBImage.total_tx_bytes = data->ContainerLength;
USB_Image_BuildTx((void *)g_USBImage.dps_request_tx_data, data->ContainerLength);
}
else if(g_USBImage.image_cmd.Parameter1 == DRSPONSE_DPS)
{
PTP_CONTAINER *data = (PTP_CONTAINER *)g_USBImage.dps_response_tx_data;
g_USBImage.state = PTP_RESPONSE;
data->ContainerLength = USB_IMAGE_CONTAINER_LENGTH + g_USBImage.send_xml_size;
data->ContainerType = USB_IMAGE_DATA_BLOCK;
data->Code = PTP_GET_OBJECT;
data->TransactionID = g_USBImage.current_transactionID;
g_USBImage.total_tx_bytes = data->ContainerLength;
USB_Image_BuildTx((void *)g_USBImage.dps_response_tx_data, data->ContainerLength);
}
else
{
PTP_CONTAINER *data = (PTP_CONTAINER *)g_USBImage.image_buffer;
kal_uint8 *index;
kal_uint32 receive_file_size;
kal_uint8 element_num;
kal_uint16 filename[] = {'I','M','G','0','0','0','1','A','.','j','p','g','\0'};
element_num = sizeof(filename)/sizeof(kal_uint16);
/* use the handle (g_USBImage.image_cmd.Parameter1) to get file name from mmi */
//ASSERT(0); if find nothing
g_USBImage.current_file_handle = FS_Open(L"c:\\photos\\IMG0001A.jpg", FS_READ_ONLY);
if(g_USBImage.current_file_handle <0)
{
USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
return;
}
if(FS_GetFileSize(g_USBImage.current_file_handle, &g_USBImage.total_tx_bytes) != FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
return;
}
g_USBImage.total_tx_bytes += USB_IMAGE_CONTAINER_LENGTH;
data->ContainerLength = g_USBImage.total_tx_bytes;
data->ContainerType = USB_IMAGE_DATA_BLOCK;
data->Code = PTP_GET_OBJECT;
data->TransactionID = g_USBImage.current_transactionID;
index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;
if(g_USBImage.total_tx_bytes > USB_IMAGE_MAX_TX_BUFFERSIZE)
{
g_USBImage.rw_buffer_index = 0;
g_USBImage.current_tx_bytes = 0;
g_USBImage.rw_bytes = USB_IMAGE_MAX_TX_BUFFERSIZE;
if(FS_Read(g_USBImage.current_file_handle, index,
USB_IMAGE_MAX_TX_BUFFERSIZE-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
return;
}
g_USBImage.state = PTP_DATA_TX;
PTP_Get_Object_Hdlr();
}
else
{
if(FS_Read(g_USBImage.current_file_handle, index,
g_USBImage.total_tx_bytes-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_OBJECT);
return;
}
g_USBImage.state = PTP_RESPONSE;
USB_Image_BuildTx((void *)g_USBImage.image_buffer, g_USBImage.total_tx_bytes);
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
}
}
}
static void PTP_Cmd_Get_Thumb(void)
{
PTP_CONTAINER *data = (PTP_CONTAINER *)g_USBImage.image_buffer;
kal_uint8 *index;
kal_uint32 receive_file_size;
kal_uint8 element_num;
kal_uint16 filename[] = {'I','M','G','0','0','0','1','A','.','j','p','g','\0'};
element_num = sizeof(filename)/sizeof(kal_uint16);
/* use the handle (g_USBImage.image_cmd.Parameter1) to get file name from mmi */
//ASSERT(0); if find nothing
g_USBImage.current_file_handle = FS_Open(L"c:\\photos\\IMG0001A.jpg", FS_READ_ONLY);
if (g_USBImage.current_file_handle <0)
{
USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
return;
}
if(FS_GetFileSize(g_USBImage.current_file_handle, &g_USBImage.total_tx_bytes) != FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
return;
}
g_USBImage.total_tx_bytes += USB_IMAGE_CONTAINER_LENGTH;
data->ContainerLength = g_USBImage.total_tx_bytes;
data->ContainerType = USB_IMAGE_DATA_BLOCK;
data->Code = PTP_GET_THUMB;
data->TransactionID = g_USBImage.current_transactionID;
index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;
if(g_USBImage.total_tx_bytes > USB_IMAGE_MAX_TX_BUFFERSIZE)
{
g_USBImage.rw_buffer_index = 0;
g_USBImage.current_tx_bytes = 0;
g_USBImage.rw_bytes = USB_IMAGE_MAX_TX_BUFFERSIZE;
if(FS_Read(g_USBImage.current_file_handle, index,
USB_IMAGE_MAX_TX_BUFFERSIZE-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
return;
}
g_USBImage.state = PTP_DATA_TX;
PTP_Get_Object_Hdlr();
}
else
{
if(FS_Read(g_USBImage.current_file_handle, index,
g_USBImage.total_tx_bytes-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_THUMB);
return;
}
g_USBImage.state = PTP_RESPONSE;
USB_Image_BuildTx((void *)g_USBImage.image_buffer, g_USBImage.total_tx_bytes);
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
}
}
static void PTP_Cmd_Get_Partial_Object(void)
{
PTP_CONTAINER *data = (PTP_CONTAINER *)g_USBImage.image_buffer;
kal_uint8 *index;
kal_uint32 receive_file_size;
kal_uint8 element_num;
kal_uint16 filename[] = {'I','M','G','0','0','0','1','A','.','j','p','g','\0'};
element_num = sizeof(filename)/sizeof(kal_uint16);
/* use the handle (g_USBImage.image_cmd.Parameter1) to get file name from mmi */
//ASSERT(0); if find nothing
g_USBImage.current_file_handle = FS_Open(L"c:\\photos\\IMG0001A.jpg", FS_READ_ONLY);
if(g_USBImage.current_file_handle <0)
{
USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
return;
}
if(g_USBImage.image_cmd.Parameter2 != 0) /* offset */
{
if(FS_Seek(g_USBImage.current_file_handle, g_USBImage.image_cmd.Parameter2, FS_FILE_BEGIN) < 0)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
return;
}
}
g_USBImage.total_tx_bytes = g_USBImage.image_cmd.Parameter3 + USB_IMAGE_CONTAINER_LENGTH;
data->ContainerLength = g_USBImage.total_tx_bytes;
data->ContainerType = USB_IMAGE_DATA_BLOCK;
data->Code = PTP_GET_PARTIAL_OBJECT;
data->TransactionID = g_USBImage.current_transactionID;
index = (kal_uint8 *)data + USB_IMAGE_CONTAINER_LENGTH;
if(g_USBImage.total_tx_bytes > USB_IMAGE_MAX_TX_BUFFERSIZE)
{
g_USBImage.rw_buffer_index = 0;
g_USBImage.current_tx_bytes = 0;
g_USBImage.rw_bytes = USB_IMAGE_MAX_TX_BUFFERSIZE;
if(FS_Read(g_USBImage.current_file_handle, index,
USB_IMAGE_MAX_TX_BUFFERSIZE-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
return;
}
g_USBImage.state = PTP_DATA_TX;
PTP_Get_Object_Hdlr();
}
else
{
if(FS_Read(g_USBImage.current_file_handle, index,
g_USBImage.total_tx_bytes-USB_IMAGE_CONTAINER_LENGTH, &receive_file_size)!= FS_NO_ERROR)
{
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
USB_Image_Cancel_By_Device(data, PTP_GET_PARTIAL_OBJECT);
return;
}
g_USBImage.state = PTP_RESPONSE;
USB_Image_BuildTx((void *)g_USBImage.image_buffer, g_USBImage.total_tx_bytes);
FS_Close(g_USBImage.current_file_handle);
g_USBImage.current_file_handle = PTP_NO_HANDLE;
}
}
static void PTP_Send_Object_Hdlr(void)
{
kal_uint8 *index = (kal_uint8*)g_USBImage.image_buffer + USB_IMAGE_CONTAINER_LENGTH;
PTPObjectInfo_Struct *data = (PTPObjectInfo_Struct *)index;
kal_uint8 *fifth_file_letter;
if(g_USBImage.image_cmd.Code == PTP_SEND_OBJECT_INFO)
{
g_USBImage.image_response.ContainerLength = USB_IMAGE_RES_3_PARA;
g_USBImage.image_response.Code = PTP_OK;
g_USBImage.image_response.TransactionID = g_USBImage.current_transactionID;
g_USBImage.image_response.Parameter1 = PTP_SCRIPT_STORAGE_ID;
g_USBImage.image_response.Parameter2 = 0xffffffff;
fifth_file_letter = index +(sizeof(PTPObjectInfo_Struct)/sizeof(kal_uint8) + 9);
switch(*fifth_file_letter) /* the fifth word */
{
case 'C':
g_USBImage.image_response.Parameter3 = HDISCVRY_DPS;
USB_Image_Send_Msg(USB_IMAGE_MSG_MMI_DISCOVERY_IND, 0, 0);
/* send a remove all storages interrupt packet */
g_USBImage.image_event.ContainerLength = USB_IMAGE_RES_1_PARA;
g_USBImage.image_event.Code = PTP_STORE_REMOVED;
g_USBImage.image_event.TransactionID = 0xffffffff;
g_USBImage.image_event.Parameter1 = PTP_ALL_STORAGE_ID;
USB_Image_Send_Intr(&g_USBImage.image_event, USB_IMAGE_RES_1_PARA);
break;
case 'U':
g_USBImage.image_response.Parameter3 = HREQUEST_DPS;
g_USBImage.dps_rx_buffer_index = 1;
if(g_USBImage.script_flag & (1<<HREQUEST) == 1<<HREQUEST)
EXT_ASSERT(0, g_USBImage.script_flag, 0, 0);
g_USBImage.script_flag |= 1<<HREQUEST;
g_USBImage.received_xml_size = data->ObjectCompressedSize;
break;
case 'O':
g_USBImage.image_response.Parameter3 = HRSPONSE_DPS;
g_USBImage.dps_rx_buffer_index = 0;
if(g_USBImage.script_flag & (1<<HRSPONSE) == 1<<HRSPONSE)
EXT_ASSERT(0, g_USBImage.script_flag, 0, 0);
g_USBImage.script_flag |= 1<<HRSPONSE;
g_USBImage.received_xml_size = data->ObjectCompressedSize;
break;
default:
EXT_ASSERT(0, *fifth_file_letter, 0, 0);
break;
}
}
else if(g_USBImage.image_cmd.Code == PTP_SEND_OBJECT)
{
g_USBImage.image_response.ContainerLength = USB_IMAGE_CONTAINER_LENGTH;
g_USBImage.image_response.Code = PTP_OK;
g_USBImage.image_response.TransactionID = g_USBImage.current_transactionID;
if((g_USBImage.total_rx_bytes-USB_IMAGE_CONTAINER_LENGTH) != g_USBImage.received_xml_size)
{
EXT_ASSERT(0, g_USBImage.total_rx_bytes-USB_IMAGE_CONTAINER_LENGTH,
g_USBImage.received_xml_size, 0);
}
if(g_USBImage.dps_rx_buffer_index == 1)
{
USB_Image_Send_Msg(USB_IMAGE_MSG_MMI_HREQUEST_IND, 0, 0);
}
else
USB_Image_Send_Msg(USB_IMAGE_MSG_MMI_HRESPONSE_IND, 0, 0);
}
/* Clear OutPktRdy */
USB_EP_Bulk_Out_Ready(g_USBImage.rxpipe->byEP);
USB_Image_ReturnTx(&g_USBImage.image_response, g_USBImage.image_response.ContainerLength);
}
static void PTP_Cmd_Unknown(void)
{
#ifndef __PRODUCTION_RELEASE__
ASSERT(0);
#endif
g_USBImage.image_event.ContainerLength = USB_IMAGE_CONTAINER_LENGTH;
g_USBImage.image_event.Code = PTP_CANCEL_TRANSACTION;
g_USBImage.image_event.TransactionID = g_USBImage.current_transactionID;
USB_Image_Send_Intr(&g_USBImage.image_event, USB_IMAGE_CONTAINER_LENGTH);
/* Send Response */
g_USBImage.state = PTP_CMD_RX;
g_USBImage.image_response.ContainerLength = USB_IMAGE_CONTAINER_LENGTH;
g_USBImage.image_response.Code = PTP_OPERATION_NOT_SUPPORTED;
g_USBImage.image_response.TransactionID = g_USBImage.current_transactionID;
USB_Image_ReturnTx(&g_USBImage.image_response, USB_IMAGE_CONTAINER_LENGTH);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -