#include <stdio.h>
#include "ipc.h"
#include "yc_timer.h"
#include "yc11xx.h"
#include "btreg.h"
#include "drv_ota.h"
#include "yc11xx_qspi.h"
#include "yc_drv_common.h"
#include "yc_lpm.h"
#include "yc11xx_bt_interface.h"
#include "system.h"
#include "LH_TaskManager.h"

uint16_t OTA_packetid;
uint32_t OTA_flash_start_addr;
uint32_t OTA_datasum,OTA_datalen;
int8_t OTA_start_ignore;
void OTA_Init()
{
 		OTA_packetid = 0;
 		OTA_datasum = 0;
 		OTA_flash_start_addr = 0;
 		OTA_datalen = 0;
 		OTA_start_ignore=0;
}

void Bt_CBChangeCode()
{
	MyPrintf("OTA_RX_OK\r\n");	
	Bt_SndCmdLeDisconnect();
	int i=10000;
	while(i--);
	uint8_t datatemp[3]={0};
	if(OTA_flash_start_addr != CODE_START_FLASHADDR1 
	 	&& OTA_flash_start_addr!= CODE_START_FLASHADDR2)
	 	return;
  
	datatemp[0] = OTA_flash_start_addr>>16;
	datatemp[1] = (OTA_flash_start_addr&0xff00)>>8;
	datatemp[2] = OTA_flash_start_addr;
	//YC_FlashSectorErase(DEVICE_INFO_BASE);
	QSPI_SectorEraseFlash(0);
	QSPI_WriteFlashData(0,3,datatemp);
	HWRITE(CORE_RESET,0x03);
	while(1);
}

//#define OTA_PACKET_LEN 0x64
#define OTA_PACKET_LEN 100
void Bt_BleOTA(uint8_t len,uint8_t *dataPtr)
{
	uint8_t j=0,data[7]={0},datatemp[32]={0};
	uint32_t i;
	
	if(*dataPtr +(*(dataPtr +1)<<8) == OTA_BLE_WRITE_HANDLE  
		&& len>3 && 	*(dataPtr+2) == OTA_EVT)
	{
		switch(*(dataPtr+3))
		{
	 		case OTA_EVT_START:				//��ʼ����
	 			if(OTA_start_ignore){
	 				OTA_start_ignore-=2;
	 				if(OTA_start_ignore<0)OTA_start_ignore=0;
	 				break;
	 			}//if start always then response when 5th
	   			if(len != 4)
	 				break;
				OTA_Init();	
			
				OTA_start_ignore=8;//ignore the start when receive a start until receive end or reset
				#ifdef HW_WATCH_DOG_FUNC
				WDT_Kick();
				#endif
				QSPI_ReadFlashData(0,3,(uint8_t *)(&OTA_flash_start_addr));				//��ȡflash ƫ�Ƶ�ַ
				
				
					
		 		if(CODE_START_FLASHADDR1 == REVERSE_3BYTE_DEFINE(OTA_flash_start_addr)){
	 				OTA_flash_start_addr = CODE_START_FLASHADDR2;
	 				}
	 			else if(CODE_START_FLASHADDR2 == REVERSE_3BYTE_DEFINE(OTA_flash_start_addr)){
	  					OTA_flash_start_addr = CODE_START_FLASHADDR1;
	  					
	  					}
	  				else
	  					break;	
					
					MyPrintf("OTA_flash_start_addr=%03x  \r\n",OTA_flash_start_addr);	
	  			for(i=0;i<0x17;i++){
	  				QSPI_SectorEraseFlash(OTA_flash_start_addr+(i<<12));		//erase flash
	  				#ifdef HW_WATCH_DOG_FUNC
						WDT_Kick();
					#endif
	  				}
				data[0] = OTA_BLE_NOTIFY_HANDLE;
				data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
				data[2] = OTA_CMD;
	 			data[3] = OTA_EVT_START;	
	 			data[4] = OTA_PACKET_LEN&0xff;
	 			data[5] = OTA_PACKET_LEN>>8;
	 			IPC_TxCommon(IPC_TYPE_BLE,data,6);
				break;
				
	 		case OTA_EVT_DATA:   		//����ota ����
	 			if(OTA_start_ignore>0)OTA_start_ignore--;
	 			if(OTA_packetid == 0 || (OTA_packetid +1) == (*(dataPtr+4) + (*(dataPtr+5) <<8))){//�жϰ�����Ƿ�����
	 				OTA_packetid = *(dataPtr+4) + (*(dataPtr+5) <<8); //���� 
	 				}
				else{
		 			break;
		 		}
				if((*(dataPtr+6)+((*(dataPtr+7))<<8)) >0)//���ȴ���0��д��
				{
	 			 	QSPI_WriteFlashData(OTA_flash_start_addr+OTA_datalen, (*(dataPtr+6)+((*(dataPtr+7))<<8)) ,dataPtr+8);//�flash
					OTA_datalen +=   (*(dataPtr+6)+((*(dataPtr+7))<<8)) ;//����д�볤��ֵ
				}
				else{
					break;		
				}
				data[0] = OTA_BLE_NOTIFY_HANDLE;
				data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
				data[2] = OTA_CMD;
	 			data[3] = OTA_EVT_DATA;
	 	 		data[4] = *(dataPtr+4);
	 			data[5] = *(dataPtr+5);
				
	 			IPC_TxCommon(IPC_TYPE_BLE,data,6);
	 			break;
	 			
	 		case OTA_EVT_END: 		//OTA ����
				data[0] = OTA_BLE_NOTIFY_HANDLE;
				data[1] = OTA_BLE_NOTIFY_HANDLE>>8;
		  	data[2] = OTA_CMD;
		 		data[3] = OTA_EVT_END;
		  	data[4] = *(dataPtr+4);
		  	data[5] = *(dataPtr+5);
				for(i=0; i<OTA_datalen; )
				{
					if(OTA_datalen-i>=32)
					{
						QSPI_ReadFlashData(OTA_flash_start_addr+i,32,datatemp);	
	 		 			for(j=0;j<32;j++)
			 				OTA_datasum += datatemp[j];
			 			i += 32;
			 		}else
			 			{
						QSPI_ReadFlashData(OTA_flash_start_addr+i,OTA_datalen-i,datatemp);	
			 			for(j=0;j<OTA_datalen-i;j++)
			 				OTA_datasum += datatemp[j];	
			 			i = OTA_datalen;
			 			}
				}
	 			if(OTA_datasum == *(dataPtr+6) + (*(dataPtr+7)<<8) + (*(dataPtr+8)<<16)
	 				&& OTA_datalen  ==  *(dataPtr+9) + (*(dataPtr+10)<<8) + (*(dataPtr+11)<<16)) {
		  				data[6] = OTA_END_CHECK_OK;			  				
							//SYS_SetTimer(&gOTATimer,20, TIMER_SINGLE|TIMER_TYPE_BIT,Bt_CBChangeCode);
							UserTimerTask_Create((void*)Bt_CBChangeCode,20);
 	  			}else
			  		{
			  			data[6] = OTA_END_CHECK_FAIL;
			  			OTA_Init();
		 	 		}
		 	 		
	 			IPC_TxCommon(IPC_TYPE_BLE,data,7);
	 			Lpm_unLockLpm(OTA_UPDATE_FLAG);
	 			break;
	 			
	 		case OTA_EVT_RESET:   	//ota ��λ 
				OTA_Init();
				break;				
			default:
				OTA_Init();
				break;
		}	
	}	
}
uint32_t Get_runAddr(void){
		QSPI_ReadFlashData(0,3,(uint8_t *)(&OTA_flash_start_addr));				//��ȡflash ƫ�Ƶ�ַ
		return REVERSE_3BYTE_DEFINE(OTA_flash_start_addr);//�ж��ǹ̼�1�ĵ�ַ ���ǹ̼�2�ĵ�ַ

}