#include "w5500api.h"
#include <string.h>
#include "w5500api.h"
#include "dhcp.h"
#include "dns.h"
#include "mqtt_api.h"
W5500_CONFIG NET_CONFIG;

uint8 txsize[MAX_SOCK_NUM] = {2,2,2,2,2,2,2,2};
uint8 rxsize[MAX_SOCK_NUM] = {2,2,2,2,2,2,2,2};

//默认值
uint8 dmac[6]={0x02,0x0e,0xc3,0x23,0x12,0x45};//MAC地址
uint8 dlip[4]={192,168,31,60};                //本机IP
uint8 dsub[4]={255,255,255,0};                //子网掩码
uint8 dgw[4]={192,168,31,1};                  //网关
uint8 ddns[4]={114,114,114,114};              //DNS
uint8 drip[4]={0,0,0,0};                      //DNS 解析到的IP

void Reset_W5500(void){
  GPIO_ResetBits(GPIOA, GPIO_Pin_15);
  delay_us(500);  
  GPIO_SetBits(GPIOA, GPIO_Pin_15);
  delay_ms(500);
}

void put_defaultNet(void){
	memcpy(NET_CONFIG.mac,dmac,6);//MAC地址
	memcpy(NET_CONFIG.lip,dlip,4);//本机IP
	memcpy(NET_CONFIG.sub,dsub,4);//子网掩码
	memcpy(NET_CONFIG.gw,dgw,4);  //网关
	memcpy(NET_CONFIG.dns,ddns,4);//DNS
	memcpy(NET_CONFIG.rip,drip,4);//DNS 解析到的IP
}

uint8 set_Network(void){
  uint8 temp[6];
  setSHAR(NET_CONFIG.mac);//一个指向负责设置MAC地址的6字节数组的指针
  setSUBR(NET_CONFIG.sub);//设置子网掩码地址
  setGAR(NET_CONFIG.gw);//一个指向负责设置网关IP地址的4字节数组的指针。
  setSIPR(NET_CONFIG.lip);//指向一个负责设置源IP地址的4字节数组的指针。

  //Init. TX & RX Memory size of w5500
  sysinit(txsize, rxsize); 
  
  setRTR(2000);/*设置溢出时间值*/
  setRCR(3);/*最大重发次数*/
  
	getSHAR(temp);//配置“源IP地址”
	if(NET_CONFIG.mac[0]==temp[0]&&NET_CONFIG.mac[1]==temp[1]&&NET_CONFIG.mac[2]==temp[2]&&
		NET_CONFIG.mac[3]==temp[3]&&NET_CONFIG.mac[4]==temp[4]&&NET_CONFIG.mac[5]==temp[5]){
		getSIPR(temp);
		if(NET_CONFIG.lip[0]==temp[0]&&NET_CONFIG.lip[1]==temp[1]&&NET_CONFIG.lip[2]==temp[2]&&
			NET_CONFIG.lip[3]==temp[3]){
			getSUBR(temp);
			if(NET_CONFIG.sub[0]==temp[0]&&NET_CONFIG.sub[1]==temp[1]&&NET_CONFIG.sub[2]==temp[2]&&
			NET_CONFIG.sub[3]==temp[3]){
				getGAR(temp);
				if(NET_CONFIG.gw[0]==temp[0]&&NET_CONFIG.gw[1]==temp[1]&&NET_CONFIG.gw[2]==temp[2]&&
				NET_CONFIG.gw[3]==temp[3])return 1;
			}
		}
	}
	return 0;
}

/**
*@brief		检测网线是否正常
*@param		无
*@return	无
*/
uint8 PHY_check(void)
{
  return 0x01&IINCHIP_READ(PHYCFGR);
}


void init_W5500(void){
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA, GPIO_Pin_15);
	WIZ_SPI_Init();
	Reset_W5500();/*硬重启W5500*/
	put_defaultNet();//赋值默认网络参数
}

void init_Net(void){
	u8 try_times=0;
	init_W5500();
	//printf("reset\r\n");
	init_dhcp_client();//初始化DHCP客户端
	//printf("okk\r\n");
	while(check_DHCP_state(SOCK_DHCP)!=DHCP_RET_UPDATE){
			try_times++;
			if(try_times==100){							//超时 重启芯片
				Reset_W5500();
				//printf("w5500 reset ok");
				init_dhcp_client();
				try_times=0;
			}
			delay_ms(5);
		}
	
	while(!set_Network());
}
