#include "modbus.h"

MODH_T g_tModH;

extern uint8_t FLAG_FrameData;
extern UART_HANDLE hUART0;
volatile uint8_t flag = 0;
uint8_t count;              //ռ
uint8_t CocheData[64];      //ʱݻ

uint16_t  Time = 0;

uint32_t Flash_Address;

uint8_t Time_1[] = "ʱ5!!!\n";
uint8_t Time_2[] = "ʱ4!!!\n";
uint8_t Time_3[] = "ʱ3!!!\n";
uint8_t Time_4[] = "ʱ2!!!\n";
uint8_t Time_5[] = "ʱ1!!!\n";
uint8_t Time_6[] = "ڽû!!!\n";

int Hardware1_StartAddress, Hardware1_EndAddress, Hardware_StartSector;
int Hardware2_StartAddress, Hardware2_EndAddress, Hardware_EndSector;

static void MODH_AnalyzeApp(void);

static void MODH_Read_01H(void);
static void MODH_Read_02H(void);
static void MODH_Read_03H(void);
static void MODH_Read_04H(void);
static void MODH_Read_05H(void);
static void MODH_Read_06H(void);
static void MODH_Read_10H(void);

void ModBus_ReceieveCMD()
{
	uint8_t i;
	if (FLAG_FrameData) {  //ڽյһ֡
		flag = 1;  //״̬־λ
		Time = 0;
		FLAG_FrameData = 0;
		count = UARTx_Rx(hUART0,g_tModH.RxBuf); //Ӵڽյ
		if(g_tModH.RxBuf[0] == SlaveAddr){ //⴮ڽյĵһλǷΪӻַ
			MODH_AnalyzeApp(); //յ
		}
		else
			printf("Slave Address error!\n");
		}
	else if(Time == 0 && flag == 0){
		UARTx_Tx(hUART0, Time_1, sizeof(Time_1)-1);
		usleep(1000000);    //ʱ1S
		Time = Time +1;
	}
	else if(Time == 1 && flag == 0){ //ʱʱ1Sδ״̬
		UARTx_Tx(hUART0, Time_2, sizeof(Time_2)-1);
		usleep(1000000);    //ʱ1S
		Time = Time +1;
	}
	else if(Time == 2 && flag == 0){ //ʱʱ2Sδ״̬
		UARTx_Tx(hUART0, Time_3, sizeof(Time_3)-1);
		usleep(1000000);    //ʱ1S
		Time = Time +1;
	}
	else if(Time == 3 && flag == 0){ //ʱʱ3Sδ״̬
		UARTx_Tx(hUART0, Time_4, sizeof(Time_4)-1);
		usleep(1000000);    //ʱ1S
		Time = Time +1;
	}
	else if(Time == 4 && flag == 0){ //ʱʱ4Sδ״̬
		UARTx_Tx(hUART0, Time_5, sizeof(Time_5)-1);
		usleep(1000000);    //ʱ1S
		Time = Time +1;
	}
	else if(Time == 5 && flag == 0){ //ʱ5Sûнյκָûڸ״̬ʱĬϽûAPP1
		UARTx_Tx(hUART0, Time_6, sizeof(Time_6)-1);
		Hardware1_StartAddress		= Hardware1_StA;
		jump_hardware1();
		Time = 0;
	}
}
//תAPP1ĳ
void jump_hardware1()
{
	IOWR(REMOTE_UPDATE_BASE, 0x0C, 0); //
	//Write start address
	IOWR(REMOTE_UPDATE_BASE, 0x10, Hardware1_StartAddress); //3
	//Trigger reconfiguration
	IOWR(REMOTE_UPDATE_BASE, 0x1D, 1); // 6
}

//תAPP2ĳ
void jump_hardware1()
{
	IOWR(REMOTE_UPDATE_BASE, 0x0C, 0); //
	//Write start address
	IOWR(REMOTE_UPDATE_BASE, 0x10, Hardware2_StartAddress); //3
	//Trigger reconfiguration
	IOWR(REMOTE_UPDATE_BASE, 0x1D, 1); // 6
}
/*
*********************************************************************************************************
*	  : MODH_AnalyzeApp
*	˵: ӦòЭ顣Ӧ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
static void MODH_AnalyzeApp(void)
{	
	switch (g_tModH.RxBuf[1])			/* 2ֽ  */
	{
		case 0x01:	/* ȡȦ״̬ */
			MODH_Read_01H();
			break;
		case 0x02:	/* ȡ״̬ */
			MODH_Read_02H();
			break;
		case 0x03:	/* ȡּĴ һּĴȡõǰĶֵ */
			MODH_Read_03H();
			break;
		case 0x04:	/* ȡĴ */
			MODH_Read_04H();
			break;
		case 0x05:	/* ǿƵȦ */
			MODH_Read_05H();
			break;
		case 0x06:	/* дĴ */
			MODH_Read_06H();
			break;	
		case 0x10:	/* дĴ */
			MODH_Read_10H();
			break;		
		default:
			printf("Function error!\n");
			break;
	}
}
/*
*********************************************************************************************************
*	  : MODH_Read_01H
*	˵: 01HָӦ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
static void MODH_Read_01H(void)
{

}

/*
*********************************************************************************************************
*	  : MODH_Read_02H
*	˵: 02HָӦ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
static void MODH_Read_02H(void)
{
	
}

/*
*********************************************************************************************************
*	  : MODH_Read_04H
*	˵: 04HָӦ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
static void MODH_Read_04H(void)
{
	
}

/*
*********************************************************************************************************
*	  : MODH_Read_05H
*	˵: 05HָӦ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
static void MODH_Read_05H(void)
{
	
}

/*
*********************************************************************************************************
*	  : MODH_Read_06H
*	˵: 06HָӦ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
static void MODH_Read_06H(void)
{
	uint16_t RX_Command;
	uint16_t CRC;
	uint8_t i;
	uint8_t DeviceID = 0;
	uint32_t FlashID = 0;
    RX_Command = ((uint16_t)g_tModH.RxBuf[4] << 8) | g_tModH.RxBuf[5];  //ԤõĵĴֵ
	CRC = ((uint16_t)g_tModH.RxBuf[6] << 8) | g_tModH.RxBuf[7]; //Уֵ
	if(((g_tModH.RxBuf[2] << 8) |  g_tModH.RxBuf[3]) == REG_Address){  //жϽյļĴַǷȷ
		switch(RX_Command << 8 | CRC)
		{
			case Erase_FlashSector << 8 | Erase_FlashSector_CRC:
			{
				//ж֮սbuffer¿ʼ
				for(i = 0;i < 12;i++){
					g_tModH.RxBuf[i] = 0;
					i++;
				}
				CMD_FlashErase(SectorErase);//flash

				break;
			}

			case Erase_FlashSubSector << 8 | Erase_FlashSubSector_CRC:
			{
				//ж֮սbuffer¿ʼ
				for(i = 0;i < 12;i++){
					g_tModH.RxBuf[i] = 0;
					i++;
				}
				CMD_FlashErase(SectorErase);//flash
				
				break;
			}

			case Write_Flash << 8 | Write_Flash_CRC:  //Flashд
			{
				//ж֮սbuffer¿ʼ
				for(i = 0;i < 8;i++){
					g_tModH.RxBuf[i] = 0;
					i++;
				}
				printf("please choice file:\n");
				FLAG_FlowData = 1;  //1ģʽ,λ1ʾյݶļе
				FLASH_ContReadData(Flash_Address);  //ģʽд
				FLAG_FlowData = 0; //ļ
				delay(80);
				GPIO_WriteBit(CM3DS_MPS2_GPIO0,GPIO_Pin_28,1); //ַллû
				break;
			}
			case Start_APP << 8 | Start_APP_CRC:  //״̬תû
			{
				//ж֮սbuffer¿ʼ
				for(i = 0;i < 8;i++){
					g_tModH.RxBuf[i] = 0;
					i++;
				}
				printf("Start to APP");
				GPIO_WriteBit(CM3DS_MPS2_GPIO0,GPIO_Pin_28,1); //ַллû
				break;
			}
			default:
				//ж֮սbuffer¿ʼ
				for(i = 0;i < 8;i++){
					g_tModH.RxBuf[i] = 0;
					i++;
				}
				printf("Preset Data or CRC error!\n");
				break;
		}
	}
	else
		printf("Register address error!\n");
}

/*
*********************************************************************************************************
*	  : MODH_Read_03H
*	˵: 03HָӦ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
void MODH_Read_03H(void)
{
	
}

/*
*********************************************************************************************************
*	  : MODH_Read_10H
*	˵: 10HָӦ
*	    : 
*	  ֵ: 
*********************************************************************************************************
*/
void MODH_Read_10H(void)
{
	
}

void delay(uint32_t t)
{
	t= t*250;
	while(t--);
}
