463 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			463 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #include "PrjCfg.h"
 | |
| //#NT#2016/05/31#Ben Wang -begin
 | |
| //#NT#Add UVC multimedia function.
 | |
| #if(UVC_MULTIMEDIA_FUNC == ENABLE)
 | |
| #include "UsbCmdInt.h"
 | |
| #include "FileSysTsk.h"
 | |
| #include "NvtUser/NvtUser.h"
 | |
| #include "SysMain.h"
 | |
| #include "AppControl/AppControl.h"
 | |
| #include "WiFiIpc/nvtwifi.h"
 | |
| #include "UIApp/Movie/UIAppMovie.h"
 | |
| #include "UIApp/Network/UIAppWiFiCmd.h"
 | |
| #include "UIApp/Network/WifiAppCmd.h"
 | |
| #include "UIApp/Network/WifiAppXML.h"
 | |
| #include "UIApp/WifiCmdParser/WifiCmdParser.h"
 | |
| #include "UIWnd/UIFlow.h"
 | |
| //#include "UIWnd/SPORTCAM/UIInfo/UIInfo.h"
 | |
| #include "UsbCmdAPI.h"
 | |
| 
 | |
| #define USB_CMD_ROOT                 '/'
 | |
| #define USB_CMD_CUSTOM_TAG           '?'
 | |
| #define XML_PATH_LEN                 (128)
 | |
| 
 | |
| static BOOL g_bUsbCmdOpened = FALSE;
 | |
| static USBCMD_MEMRANGE g_PayloadHeader[4] = {0};
 | |
| USBCMD_MEMRANGE g_RecvBuf[2] = {0};
 | |
| USBCMD_MEMRANGE g_SendBuf[3] = {0};
 | |
| static char UploadFile[XML_PATH_LEN] = {0};
 | |
| static char DownloadFile[XML_PATH_LEN] = {0};
 | |
| 
 | |
| extern WIFI_CMD_ENTRY Cmd_uvc[];
 | |
| 
 | |
| static int XML_SetUploadPath(char *path, char *argument, HFS_U32 bufAddr, HFS_U32 *bufSize, char *mimeType, HFS_U32 segmentCount)
 | |
| {
 | |
| 	char   *pch = 0;
 | |
| 
 | |
| 	pch = strrchr(argument, '&');
 | |
| 	if (pch) {
 | |
| 		if (strncmp(pch, PARS_STR, strlen(PARS_STR)) == 0) {
 | |
| 			memset((void *)UploadFile, 0, sizeof(UploadFile));
 | |
| 			sscanf_s(pch + strlen(PARS_STR), "%s", &UploadFile, sizeof(UploadFile));
 | |
| 		}
 | |
| 		DBG_IND("Upload File path=%s\r\n", UploadFile);
 | |
| 		if (strlen(UploadFile) >= XML_PATH_LEN - 1) {
 | |
| 			DBG_WRN("path might overflow!\r\n");
 | |
| 		}
 | |
| 		XML_DefaultFormat(USBCMD_UPLOAD_FILE_PATH, WIFIAPP_RET_OK, bufAddr, bufSize, mimeType);
 | |
| 	} else {
 | |
| 		XML_DefaultFormat(USBCMD_UPLOAD_FILE_PATH, WIFIAPP_RET_PAR_ERR, bufAddr, bufSize, mimeType);
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static int XML_SetDownloadPath(char *path, char *argument, HFS_U32 bufAddr, HFS_U32 *bufSize, char *mimeType, HFS_U32 segmentCount)
 | |
| {
 | |
| 	char   *pch = 0;
 | |
| 
 | |
| 
 | |
| 	pch = strrchr(argument, '&');
 | |
| 	if (pch) {
 | |
| 		FST_FILE fhdl;
 | |
| 		if (strncmp(pch, PARS_STR, strlen(PARS_STR)) == 0) {
 | |
| 			memset((void *)DownloadFile, 0, sizeof(DownloadFile));
 | |
| 			sscanf_s(pch + strlen(PARS_STR), "%s", &DownloadFile, sizeof(DownloadFile));
 | |
| 		}
 | |
| 		DBG_IND("Download File path=%s\r\n", DownloadFile);
 | |
| 		fhdl = FileSys_OpenFile(DownloadFile, FST_OPEN_READ | FST_OPEN_EXISTING);
 | |
| 		if (fhdl) {
 | |
| 			FileSys_CloseFile(fhdl);
 | |
| 			XML_DefaultFormat(USBCMD_DOWNLOAD_FILE_PATH, WIFIAPP_RET_OK, bufAddr, bufSize, mimeType);
 | |
| 			vos_flag_set(FLG_ID_USBCMD, FLGUSBCMD_DOWNLOAD);
 | |
| 		} else {
 | |
| 			XML_DefaultFormat(USBCMD_DOWNLOAD_FILE_PATH, WIFIAPP_RET_NOFILE, bufAddr, bufSize, mimeType);
 | |
| 			//reset download file path
 | |
| 			DownloadFile[0] = 0;
 | |
| 		}
 | |
| 
 | |
| 	} else {
 | |
| 		XML_DefaultFormat(USBCMD_DOWNLOAD_FILE_PATH, WIFIAPP_RET_PAR_ERR, bufAddr, bufSize, mimeType);
 | |
| 	}
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| static void UsbCmd_Init(void)
 | |
| {
 | |
| 	WifiAppCmd_init();
 | |
| 	WifiCmd_ReceiveCmd(TRUE);
 | |
| 	WifiCmd_SetExecTable(Cmd_uvc);
 | |
| }
 | |
| 
 | |
| ER UsbCmd_Open(PUSBCMD_MEMRANGE pWorkBuf)
 | |
| {
 | |
| 	if (MIN_USB_CMD_BUF_SIZE < pWorkBuf->size) {
 | |
| 		DBG_ERR("Buffer size is too small!\r\n");
 | |
| 		return E_SYS;
 | |
| 	}
 | |
| 	if (pWorkBuf->addr_pa & 0x3) {
 | |
| 		DBG_ERR("Buffer sholud word-aligned!\r\n");
 | |
| 		return E_SYS;
 | |
| 	}
 | |
| 	if (g_bUsbCmdOpened) {
 | |
| 		return E_SYS;
 | |
| 	}
 | |
| 	//to do, check alignment
 | |
| 	// each g_PayloadHeader size = 8, tatal 32
 | |
| 	g_PayloadHeader[0].addr_pa = pWorkBuf->addr_pa;
 | |
| 	g_PayloadHeader[0].addr_va = pWorkBuf->addr_va;
 | |
| 	g_PayloadHeader[0].size    = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 	g_PayloadHeader[1].addr_pa = g_PayloadHeader[0].addr_pa + g_PayloadHeader[0].size;
 | |
| 	g_PayloadHeader[1].addr_va = g_PayloadHeader[0].addr_va + g_PayloadHeader[0].size;
 | |
| 	g_PayloadHeader[1].size    = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 	g_PayloadHeader[2].addr_pa = g_PayloadHeader[1].addr_pa + g_PayloadHeader[1].size;
 | |
| 	g_PayloadHeader[2].addr_va = g_PayloadHeader[1].addr_va + g_PayloadHeader[1].size;
 | |
| 	g_PayloadHeader[2].size    = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 	g_PayloadHeader[3].addr_pa = g_PayloadHeader[2].addr_pa + g_PayloadHeader[2].size;
 | |
| 	g_PayloadHeader[3].addr_va = g_PayloadHeader[2].addr_va + g_PayloadHeader[2].size;
 | |
| 	g_PayloadHeader[3].size    = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 	// each g_RecvBuf size = 128, tatal 256
 | |
| 	g_RecvBuf[0].addr_pa       = g_PayloadHeader[3].addr_pa + g_PayloadHeader[3].size;
 | |
| 	g_RecvBuf[0].addr_va       = g_PayloadHeader[3].addr_va + g_PayloadHeader[3].size;
 | |
| 	g_RecvBuf[0].size          = 128;
 | |
| 	g_RecvBuf[1].addr_pa       = g_RecvBuf[0].addr_pa + g_RecvBuf[0].size;
 | |
| 	g_RecvBuf[1].addr_va       = g_RecvBuf[0].addr_va + g_RecvBuf[0].size;
 | |
| 	g_RecvBuf[1].size          = 128;
 | |
| 	// g_SendBuf[0] size = 128
 | |
| 	g_SendBuf[0].addr_pa       = g_RecvBuf[1].addr_pa + g_RecvBuf[1].size;
 | |
| 	g_SendBuf[0].addr_va       = g_RecvBuf[1].addr_va + g_RecvBuf[1].size;
 | |
| 	g_SendBuf[0].size          = 128;
 | |
| 	// g_SendBuf[1] size = pWorkBuf->size / 2 - 512
 | |
| 	g_SendBuf[1].addr_pa       = pWorkBuf->addr_pa + 512;
 | |
| 	g_SendBuf[1].addr_va       = pWorkBuf->addr_va + 512;
 | |
| 	g_SendBuf[1].size          = pWorkBuf->size / 2 - 512;
 | |
| 	// g_SendBuf[2] size = pWorkBuf->size / 2
 | |
| 	g_SendBuf[2].addr_pa       = g_SendBuf[1].addr_pa + g_SendBuf[1].size;
 | |
| 	g_SendBuf[2].addr_va       = g_SendBuf[1].addr_va + g_SendBuf[1].size;
 | |
| 	g_SendBuf[2].size          = pWorkBuf->size / 2;
 | |
| 
 | |
| 	g_bUsbCmdOpened = TRUE;
 | |
| 	UsbCmdTsk_Open();
 | |
| 	UsbCmd_Init();
 | |
| 	return E_OK;
 | |
| }
 | |
| 
 | |
| ER UsbCmd_Close(void)
 | |
| {
 | |
| 	if (!g_bUsbCmdOpened) {
 | |
| 		return E_SYS;
 | |
| 	}
 | |
| 	UsbCmdTsk_Close();
 | |
| 	g_bUsbCmdOpened = FALSE;
 | |
| 	return E_OK;
 | |
| }
 | |
| 
 | |
| int UsbCmd_Send(char *addr, int *size)
 | |
| {
 | |
| 	int ret;
 | |
| 	USBCMD_PAYLOAD_HEADER *pPayloadHeader = (USBCMD_PAYLOAD_HEADER *)g_PayloadHeader[0].addr_va;
 | |
| 	UINT32 HeaderSize;
 | |
| 	DBG_FUNC_BEGIN("\r\n");
 | |
| 	HeaderSize = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 	pPayloadHeader->TotalLength = HeaderSize + *size;
 | |
| 	pPayloadHeader->Type = USBCMD_PAYLOAD_NOTIFICATION;
 | |
| 	vos_sem_wait(SEMID_USBCMD_1ST_COM);
 | |
| 	hd_common_mem_flush_cache((void *)g_PayloadHeader[0].addr_va, HeaderSize);
 | |
| 	ret = UVAC_WriteCdcData(USB_CMD_PORT, (UINT8 *)g_PayloadHeader[0].addr_pa, HeaderSize, 0);
 | |
| 	if ((ret >= 0) && (ret == (int)HeaderSize)) {
 | |
| 		if ((UINT32)*size > g_SendBuf[0].size) {
 | |
| 			DBG_WRN("send size %d > buffer size %d\r\n", *size, g_SendBuf[0].size);
 | |
| 			*size = g_SendBuf[0].size;
 | |
| 		}
 | |
| 		memcpy((void *)g_SendBuf[0].addr_va, (void *)addr, *size);
 | |
| 		hd_common_mem_flush_cache((void *)g_SendBuf[0].addr_va, *size);
 | |
| 		ret = UVAC_WriteCdcData(USB_CMD_PORT, (UINT8 *)g_SendBuf[0].addr_pa, *size, 0);
 | |
| 	}
 | |
| 	vos_sem_sig(SEMID_USBCMD_1ST_COM);
 | |
| 	DBG_FUNC_END("\r\n");
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| int UsbCmd_SendRAW(char *addr, int *size)
 | |
| {
 | |
| 	int ret;
 | |
| 	USBCMD_PAYLOAD_HEADER *pPayloadHeader = (USBCMD_PAYLOAD_HEADER *)g_PayloadHeader[1].addr_va;
 | |
| 	UINT32 HeaderSize;
 | |
| 	DBG_FUNC_BEGIN("\r\n");
 | |
| 	HeaderSize = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 	pPayloadHeader->TotalLength = HeaderSize + *size;
 | |
| 	pPayloadHeader->Type = USBCMD_PAYLOAD_RAW_DATA;
 | |
| 	hd_common_mem_flush_cache((void *)g_PayloadHeader[1].addr_va, HeaderSize);
 | |
| 	ret = UVAC_WriteCdcData(USB_DATA_PORT, (UINT8 *)g_PayloadHeader[1].addr_pa, HeaderSize, 0);
 | |
| 	if ((ret >= 0) && (ret == (int)HeaderSize)) {
 | |
| 		if ((UINT32)*size > g_SendBuf[2].size) {
 | |
| 			DBG_WRN("send size %d > buffer size %d\r\n", *size, g_SendBuf[2].size);
 | |
| 			*size = g_SendBuf[2].size;
 | |
| 		}
 | |
| 		memcpy((void *)g_SendBuf[2].addr_va, (void *)addr, *size);
 | |
| 		hd_common_mem_flush_cache((void *)g_SendBuf[2].addr_va, *size);
 | |
| 		ret = UVAC_WriteCdcData(USB_DATA_PORT, (UINT8 *)g_SendBuf[2].addr_pa, *size, 0);
 | |
| 	}
 | |
| 	DBG_FUNC_END("\r\n");
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| void UsbCmdHandler(UINT8 *pUsbCmdStr, UINT32 CmdStrLen)
 | |
| {
 | |
| 	char   *pch;
 | |
| 	UINT32 uiSendBufSize;
 | |
| 	char mimeType[64];//just a dummy buffer for using WifiCmd_GetData
 | |
| 	INT32 WifiCmdRet;
 | |
| 	UINT32 segmentCount = 0;
 | |
| 	UINT32 cmd = 0;
 | |
| 	DBG_FUNC_BEGIN("\r\n");
 | |
| 	DBG_IND("pUsbCmdStr=%s\r\n", pUsbCmdStr);
 | |
| 	//if(strncmp(pch,USB_CMD_ROOT,strlen(USB_CMD_ROOT)))
 | |
| 	if (*pUsbCmdStr != USB_CMD_ROOT) {
 | |
| 		DBG_WRN("Not a valid cmd (%s)\r\n", pUsbCmdStr);
 | |
| 		return;
 | |
| 	}
 | |
| 	pch = strchr((char *)pUsbCmdStr, USB_CMD_CUSTOM_TAG);
 | |
| 	if (pch) {
 | |
| 		if (strncmp(pch + 1, CMD_STR, strlen(CMD_STR)) == 0) {
 | |
| 			sscanf_s(pch + 1 + strlen(CMD_STR), "%d", &cmd);
 | |
| 			DBGD(cmd);
 | |
| 			//to do
 | |
| 			//specail handle
 | |
| 		}
 | |
| 		//the argument "path" of WifiCmd_GetData is the string prior to '?'
 | |
| 		*pch = 0;
 | |
| USB_GET_CMD_DATA:
 | |
| 		uiSendBufSize = g_SendBuf[1].size;
 | |
| 		WifiCmdRet = WifiCmd_GetData((char *)pUsbCmdStr, pch + 1, g_SendBuf[1].addr_va, &uiSendBufSize, mimeType, segmentCount);
 | |
| 		vos_sem_wait(SEMID_USBCMD_1ST_COM);
 | |
| 		DBG_IND("WifiCmdRet=%d, len=%d(0x%X)\r\n", WifiCmdRet, uiSendBufSize, uiSendBufSize);
 | |
| 		if (WIFI_CMD_GETDATA_RETURN_OK == WifiCmdRet) {
 | |
| 			USBCMD_PAYLOAD_HEADER *pPayloadHeader = (USBCMD_PAYLOAD_HEADER *)g_PayloadHeader[2].addr_va;
 | |
| 			UINT32 HeaderSize;
 | |
| 			HeaderSize = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 			pPayloadHeader->Type = USBCMD_PAYLOAD_RETURN;
 | |
| 			if (0 == segmentCount) {
 | |
| 				pPayloadHeader->TotalLength = HeaderSize + uiSendBufSize;
 | |
| 				hd_common_mem_flush_cache((void *)g_PayloadHeader[2].addr_va, HeaderSize);
 | |
| 				UVAC_WriteCdcData(USB_CMD_PORT, (UINT8 *)g_PayloadHeader[2].addr_pa, HeaderSize, 0);
 | |
| 			}
 | |
| 			//DBG_IND("%s\r\n",g_SendBuf1.Addr);
 | |
| 			hd_common_mem_flush_cache((void *)g_SendBuf[1].addr_va, uiSendBufSize);
 | |
| 			UVAC_WriteCdcData(USB_CMD_PORT, (UINT8 *)g_SendBuf[1].addr_pa, uiSendBufSize, 0);
 | |
| 
 | |
| 			if (segmentCount) { //for unknown data length end
 | |
| 				pPayloadHeader->TotalLength = UNKNOWN_PAYLOAD_LENGTH_END;
 | |
| 				hd_common_mem_flush_cache((void *)g_PayloadHeader[2].addr_va, HeaderSize);
 | |
| 				UVAC_WriteCdcData(USB_CMD_PORT, (UINT8 *)g_PayloadHeader[2].addr_pa, HeaderSize, 0);
 | |
| 			}
 | |
| 
 | |
| 			if (WIFIAPP_CMD_MOVIE_REC_SIZE == cmd) {
 | |
| 				DBG_IND("FL_MOVIE_SIZE_MENU=%d, FL_MOVIE_SIZE=%d\r\n", UI_GetData(FL_MOVIE_SIZE_MENU), UI_GetData(FL_MOVIE_SIZE));
 | |
| 			}
 | |
| 			if (FlowMovie_CheckReOpenItem()) {
 | |
| 				DBG_IND("reopen\r\n");
 | |
| 				Ux_PostEvent(NVTEVT_SYSTEM_MODE, 1, System_GetState(SYS_STATE_CURRMODE));
 | |
| 
 | |
| 			}
 | |
| 		} else if (WIFI_CMD_GETDATA_RETURN_CONTINUE == WifiCmdRet) {
 | |
| 			//DBG_IND("%s\r\n",g_SendBuf1.Addr);
 | |
| 			if (0 == segmentCount) { //for unknown data length begin
 | |
| 				USBCMD_PAYLOAD_HEADER *pPayloadHeader = (USBCMD_PAYLOAD_HEADER *)g_PayloadHeader[2].addr_va;
 | |
| 				UINT32 HeaderSize;
 | |
| 				HeaderSize = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 				pPayloadHeader->TotalLength = UNKNOWN_PAYLOAD_LENGTH_BEGIN;
 | |
| 				pPayloadHeader->Type = USBCMD_PAYLOAD_RETURN;
 | |
| 				hd_common_mem_flush_cache((void *)g_PayloadHeader[2].addr_va, HeaderSize);
 | |
| 				UVAC_WriteCdcData(USB_CMD_PORT, (UINT8 *)g_PayloadHeader[2].addr_pa, HeaderSize, 0);
 | |
| 			}
 | |
| 			hd_common_mem_flush_cache((void *)g_SendBuf[1].addr_va, uiSendBufSize);
 | |
| 			UVAC_WriteCdcData(USB_CMD_PORT, (UINT8 *)g_SendBuf[1].addr_pa, uiSendBufSize, 0);
 | |
| 			segmentCount++;
 | |
| 			goto USB_GET_CMD_DATA;
 | |
| 		} else { //WIFI_CMD_GETDATA_RETURN_ERROR
 | |
| 			//just do nothing or return customed tag to inform the host that data is aborted ?
 | |
| 		}
 | |
| 		vos_sem_sig(SEMID_USBCMD_1ST_COM);
 | |
| 	} else { //no '?'
 | |
| 		//just ignore!?
 | |
| 	}
 | |
| 	DBG_FUNC_END("\r\n");
 | |
| }
 | |
| 
 | |
| //handle received data
 | |
| void UsbRcvDataHandler(UINT32 Addr, UINT32 Size)
 | |
| {
 | |
| 	PUSBCMD_PAYLOAD_HEADER pPayloadHeader  = (PUSBCMD_PAYLOAD_HEADER)Addr;
 | |
| 	static UINT32 RemainLen;
 | |
| 	static FST_FILE fhdl = 0;
 | |
| 	UINT32 bufAddr = 0, fileSize = 0;
 | |
| 	UINT32 PayloadHeadSize = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 	if (pPayloadHeader->Type == USBCMD_PAYLOAD_RAW_DATA && Size >= PayloadHeadSize) {
 | |
| 		if (pPayloadHeader->TotalLength) {
 | |
| 			//begin
 | |
| 			RemainLen = pPayloadHeader->TotalLength;
 | |
| 			if (RemainLen > PayloadHeadSize) {
 | |
| 				if (fhdl) {
 | |
| 					DBG_WRN("Host flow NG! Close previous file first!\r\n");
 | |
| 					FileSys_CloseFile(fhdl);
 | |
| 					fhdl = 0;
 | |
| 					UploadFile[0] = 0;//reset path
 | |
| 				}
 | |
| 				DBG_IND("TotalLength=%d\r\n", RemainLen);
 | |
| 				RemainLen -= PayloadHeadSize;
 | |
| 				fileSize = Size - PayloadHeadSize;
 | |
| 				bufAddr = Addr + PayloadHeadSize;
 | |
| 				if (strlen(UploadFile) > strlen("A:\\")) {
 | |
| 					fhdl = FileSys_OpenFile(UploadFile, FST_CREATE_ALWAYS | FST_OPEN_WRITE);
 | |
| 					FileSys_SeekFile(fhdl, 0, FST_SEEK_SET);
 | |
| 				} else {
 | |
| 					DBG_ERR("Set upload file path by CMD 5001 first!\r\n");
 | |
| 				}
 | |
| 			} else {
 | |
| 				DBG_ERR("Payload header size(%d) error.\r\n", RemainLen);
 | |
| 			}
 | |
| 		} else {
 | |
| 			//end
 | |
| 			if (fhdl) {
 | |
| 				DBG_IND("Close unknown length file.\r\n");
 | |
| 				FileSys_CloseFile(fhdl);
 | |
| 				fhdl = 0;
 | |
| 				UploadFile[0] = 0;//reset path
 | |
| 			}
 | |
| 		}
 | |
| 	} else {
 | |
| 		bufAddr = Addr;
 | |
| 		fileSize = Size;
 | |
| 	}
 | |
| 	if (fileSize && fhdl) {
 | |
| 		//DBG_IND("write file(%d).\r\n",fileSize);
 | |
| 		FileSys_WriteFile(fhdl, (UINT8 *)bufAddr, &fileSize, 0, NULL);
 | |
| 		if (RemainLen >= fileSize) {
 | |
| 			RemainLen -= fileSize;
 | |
| 		} else {
 | |
| 			RemainLen = 0;
 | |
| 			DBG_WRN("Payload header size NG!\r\n");
 | |
| 		}
 | |
| 		if (0 == RemainLen) {
 | |
| 			DBG_IND("Close file.\r\n");
 | |
| 			FileSys_CloseFile(fhdl);
 | |
| 			fhdl = 0;
 | |
| 			UploadFile[0] = 0;//reset path
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| //send data to USB host
 | |
| void UsbCmdDownloadHandler(void)
 | |
| {
 | |
| 	FST_FILE fhdl = 0;
 | |
| 	UINT32 BufSize = g_SendBuf[2].size;
 | |
| 	int ret = 0;
 | |
| 
 | |
| 	DBG_FUNC_BEGIN("\r\n");
 | |
| 	fhdl = FileSys_OpenFile(DownloadFile, FST_OPEN_READ | FST_OPEN_EXISTING);
 | |
| 	if (fhdl) {
 | |
| 		USBCMD_PAYLOAD_HEADER *pPayloadHeader = (USBCMD_PAYLOAD_HEADER *)g_PayloadHeader[3].addr_va;
 | |
| 		UINT32 HeaderSize = sizeof(USBCMD_PAYLOAD_HEADER);
 | |
| 		UINT32 RemainSize;
 | |
| 		FST_FILE_STATUS   FileStat;
 | |
| 		FileSys_StatFile(fhdl, &FileStat);
 | |
| 
 | |
| 		pPayloadHeader->TotalLength = HeaderSize + (UINT32)FileStat.uiFileSize;
 | |
| 		pPayloadHeader->Type = USBCMD_PAYLOAD_RAW_DATA;
 | |
| 		//send payload header
 | |
| 		hd_common_mem_flush_cache((void *)g_PayloadHeader[3].addr_va, HeaderSize);
 | |
| 		UVAC_WriteCdcData(USB_DATA_PORT, (UINT8 *)g_PayloadHeader[3].addr_pa, HeaderSize, 0);
 | |
| 		RemainSize = (UINT32)FileStat.uiFileSize;
 | |
| 		DBG_IND("Download %s, size=%d(0x%X).\r\n", DownloadFile, RemainSize, RemainSize);
 | |
| 		//send payload data
 | |
| //Perf_Mark();
 | |
| 		while (RemainSize) {
 | |
| 			if (RemainSize > g_SendBuf[2].size) {
 | |
| 				BufSize = g_SendBuf[2].size;
 | |
| 			} else {
 | |
| 				BufSize = RemainSize;
 | |
| 			}
 | |
| 			FileSys_ReadFile(fhdl, (UINT8 *)g_SendBuf[2].addr_va, &BufSize, 0, NULL);
 | |
| 			hd_common_mem_flush_cache((void *)g_SendBuf[2].addr_va, BufSize);
 | |
| 
 | |
| 			ret = UVAC_WriteCdcData(USB_DATA_PORT, (UINT8 *)g_SendBuf[2].addr_pa, BufSize, 0);
 | |
| 			if ((ret >= 0) && (ret == (int)BufSize)) {
 | |
| 				RemainSize -= BufSize;
 | |
| 			} else {
 | |
| 				DBGD(RemainSize);
 | |
| 				break;
 | |
| 			}
 | |
| 		}
 | |
| //DBG_DUMP("%dKB,%dms, %d KB/sec\r\n",PayloadHeader.TotalLength/1024,Perf_GetDuration()/1000,PayloadHeader.TotalLength*1000/(Perf_GetDuration()/1000)/1024);
 | |
| 		FileSys_CloseFile(fhdl);
 | |
| 		DownloadFile[0] = 0;//reset path
 | |
| 	} else {
 | |
| 		DBG_ERR("%s didn't exist.\r\n", DownloadFile);
 | |
| 	}
 | |
| 
 | |
| 	DBG_FUNC_END("\r\n");
 | |
| }
 | |
| 
 | |
| WIFI_CMD_BEGIN(uvc)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_RECORDING_TIME, 0, (UINT32)XML_GetMovieRecStatus, 0, FL_MOVIE_REC)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_REC_TRIGGER_RAWENC, NVTEVT_WIFI_EXE_MOVIE_TRIGGER_RAWENC, 0, WIFIFLAG_MOVIE_REC_RAWENC_DONE, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_GET_RAWENC_JPG, 0, (UINT32)XML_GetRawEncJpg, 0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_GET_LIVEVIEW_FMT, 0, (UINT32)XML_GetLiveViewFmt, 0, FL_NULL)
 | |
| 
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_RECORD, NVTEVT_WIFI_EXE_MOVIE_REC, 0, WIFIFLAG_RECORD_DONE, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_REC_SIZE, NVTEVT_WIFI_EXE_MOVIE_REC_SIZE, 0, 0, FL_MOVIE_SIZE)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_CYCLIC_REC, NVTEVT_WIFI_EXE_CYCLIC_REC, 0, 0, FL_MOVIE_CYCLIC_REC)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_WDR, NVTEVT_WIFI_EXE_MOVIE_WDR, 0, 0, FL_MOVIE_WDR)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_EV, NVTEVT_WIFI_EXE_MOVIE_EV, 0, 0, FL_EV)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOTION_DET, NVTEVT_WIFI_EXE_MOTION_DET, 0, 0, FL_MOVIE_MOTION_DET)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_AUDIO, NVTEVT_WIFI_EXE_MOVIE_AUDIO, 0, 0, FL_MOVIE_AUDIO)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_DATEIMPRINT, NVTEVT_WIFI_EXE_DATEIMPRINT, 0, 0, FL_MOVIE_DATEIMPRINT)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MAX_RECORD_TIME, 0, (UINT32)XML_GetMaxRecordTime, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_GSENSOR_SENS, NVTEVT_WIFI_EXE_MOVIE_GSENSOR_SENS, 0, 0, FL_GSENSOR)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_SET_AUTO_RECORDING, NVTEVT_WIFI_EXE_SET_AUTO_RECORDING, 0, 0, FL_WIFI_AUTO_RECORDING)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_REC_BITRATE    ,NVTEVT_WIFI_EXE_MOVIE_REC_BITRATE, 0,0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_LIVEVIEW_BITRATE, NVTEVT_WIFI_EXE_MOVIE_LIVEVIEW_BITRATE, 0,0, FL_NULL)
 | |
| //since it might change mode to re-open UsbCmdTsk, just don't wiat for WIFIFLAG_PREVIEW_DONE
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_LIVEVIEW_START, NVTEVT_WIFI_EXE_MOVIE_LIVEVIEW_START, 0, 0/*WIFIFLAG_PREVIEW_DONE*/, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_MODECHANGE,NVTEVT_WIFI_EXE_MODE,0,WIFIFLAG_MODE_DONE, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_QUERY, 0, (UINT32)XML_QueryCmd, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_SET_DATE, NVTEVT_WIFI_EXE_SET_DATE, 0, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_SET_TIME, NVTEVT_WIFI_EXE_SET_TIME, 0, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_POWEROFF, NVTEVT_WIFI_EXE_POWEROFF, 0, 0, FL_AUTO_POWER_OFF)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_LANGUAGE, NVTEVT_WIFI_EXE_LANGUAGE, 0, 0, FL_LANGUAGE)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_TVFORMAT, NVTEVT_WIFI_EXE_TVFORMAT, 0, 0, FL_TV_MODE)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_FORMAT, NVTEVT_WIFI_EXE_FORMAT, 0, WIFIFLAG_FORMAT_DONE, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_SYSRESET, NVTEVT_WIFI_EXE_SYSRESET, 0, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_VERSION, 0, (UINT32)XML_GetVersion, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_FWUPDATE, NVTEVT_WIFI_EXE_FWUPDATE, 0, WIFIFLAG_UPDATE_DONE, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_QUERY_CUR_STATUS, 0, (UINT32)XML_QueryCmd_CurSts, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_FILELIST, 0, (UINT32)XML_FileList, 0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_HEARTBEAT, 0, (UINT32)XML_GetHeartBeat, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_DISK_FREE_SPACE, 0, (UINT32)XML_GetDiskFreeSpace, 0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_RECONNECT_WIFI,NVTEVT_WIFI_EXE_RECONNECT       ,0,0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_GET_BATTERY, 0, (UINT32)XML_GetBattery, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_SAVE_MENUINFO, NVTEVT_WIFI_EXE_SAVEMENU, 0, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_GET_HW_CAP, 0, (UINT32)XML_HWCapability, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_REMOVE_USER, NVTEVT_WIFI_EXE_REMOVE_USER, 0, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_GET_CARD_STATUS, 0, (UINT32)XML_GetCardStatus, 0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_GET_DOWNLOAD_URL, 0, (UINT32)XML_GetDownloadURL,0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_GET_UPDATEFW_PATH, 0, (UINT32)XML_GetUpdateFWPath,0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_SET_PIP_STYLE, NVTEVT_WIFI_EXE_PIP_STYLE, 0, 0, FL_DUAL_CAM)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_GET_SSID_PASSPHRASE, 0, (UINT32)XML_GetSSID_passphrase, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_QUERY_MOVIE_SIZE, 0, (UINT32)XML_GetMovieSizeCapability, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_QUERY_MENUITEM, 0, (UINT32)XML_GetMenuItem, 0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_AUTO_TEST_CMD_DONE, 0       ,(UINT32)XML_AutoTestCmdDone,0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_THUMB, 0, (UINT32)XML_GetThumbnail, 0, FL_NULL)
 | |
| //WIFI_CMD_ITEM(WIFIAPP_CMD_SCREEN, 0, (UINT32)XML_GetScreen, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_MOVIE_FILE_INFO, 0, (UINT32)XML_GetMovieFileInfo, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_DELETE_ONE, 0, (UINT32)XML_DeleteOnePicture, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(WIFIAPP_CMD_DELETE_ALL, 0, (UINT32)XML_DeleteAllPicture, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(USBCMD_UPLOAD_FILE_PATH, 0, (UINT32)XML_SetUploadPath, 0, FL_NULL)
 | |
| WIFI_CMD_ITEM(USBCMD_DOWNLOAD_FILE_PATH, 0, (UINT32)XML_SetDownloadPath, 0, FL_NULL)
 | |
| WIFI_CMD_END()
 | |
| 
 | |
| #endif
 | |
| //#NT#2016/05/31#Ben Wang -end
 | |
| 
 | 
