www.pudn.com > TCPmodbushy.rar > master.c


/****************************************************************************** 
 * Project     : t_box 
 * Module Name : master.C 
 * CPU Type    : C8051F340 
 * 
 * Description : 
 * 
 * History        Author     Version       Comment 
 * 2006.10.22       HY       V0.0         Original version 
 * 
 * Copyright (C) 2006 HY. All rights reserved. 
 ******************************************************************************/ 
#include  "o:\sysdef.h" 
#include   
#include "o:/lwip/tcp.h" 
#include "o:/lwip/pbuf.h" 
#include "o:/IPV4/lwip/ip_addr.h" 
uint data landTIME;			/* interval of each land*/ 
uchar data UART_out_time; 
uchar data FrameDataReceived; 
uchar  idata	head_info[16]; 
uchar  idata 	comm_send_protocol; 
uchar  idata 	commDelyTime; 
bit  data 	slave_send_flag; 
MEMB xdata *ip_station_list; 
 
uchar IpConflictTime;								// (0.25*IpConflictTime)S 
 
#ifdef   TESTDEBUG 
uchar  test[14]; 
#endif 
/****************************************************************************** 
* Name: InitOther 
******************************************************************************/ 
void InitPara( void ) 
{ 
#ifdef   TESTDEBUG 
	uchar i; 
#endif 
	uchar xdata tmp[BAUDRATE_LEN+PARITYTYPE_LEN+DATABITS_LEN+STOPBITS_LEN]; 
	ReadBytesFromFlash( BAUDRATE_ADDRESS, BAUDRATE_LEN, tmp); 
	ReadBytesFromFlash( PARITYTYPE_ADDRESS, PARITYTYPE_LEN, &(tmp[2])); 
	ReadBytesFromFlash( DATABITS_ADDRESS, DATABITS_LEN, &(tmp[3])); 
	ReadBytesFromFlash( STOPBITS_ADDRESS, STOPBITS_LEN, &(tmp[4])); 
	InitCommuPort(MAKE_WORD( tmp[0], tmp[1] ),tmp[2],tmp[3],tmp[4]); 
	//InitCommuPort(57600,1,8,1); 
	FrameDataReceived = START_SEND; 
	//set send comm data protocol 
	comm_send_protocol = ReadByteFromFlash( PROTOCOL_TYPE ); 
	commDelyTime = 0; 
//	commDelyTime = ReadByteFromFlash( COMM_SEND_DELYTIME ); 
#ifdef   TESTDEBUG 
	for(i = 0;i<14;i++) 
	{ 
		test[i] = 0; 
	} 
#endif 
	affair_head = MIN_AFFAIR; 
	affair_tail = MIN_AFFAIR; 
	initTransaction(); 
	land_sever1_flag = LAND_SEVER; 
    land_sever2_flag = LAND_SEVER; 
	send_net_type_flag = NO; 
	com_flag = NO; 
	master_sendcommdata_flag = NO; 
	master_com_flag = NO; 
	slave_send_flag = NO; 
} 
 
/***************************************************************************** 
* master function 
*****************************************************************************/ 
void input( void ) 
{ 
	if( CurWorkState & AUTOLAND ) 
	{ 
		land_function(); 
	} 
	if(send_net_type_flag) 
	{ 
		net_type_function(1); 
		net_type_function(2); 
	} 
	if(pCashData) 
	{ 
		apply_process();				/*get data from pCashData*/ 
	} 
	if( !(CurWorkState & MASTER_NOT_SLAVE) ) 
	{ 
		s_uart(); 
	} 
	else 
	{ 
		m_uart(); 
	} 
} 
 
/**************************************************************************** 
function: Init_TBox_State 
*****************************************************************************/ 
void Init_TBox_State( void ) 
{ 
	IpConflictTime = 0;								// (0.25*IpConflictTime)S 
	IP_LED = LED_OFF; 
 
	if( CurWorkState & SETPARA_NOT_WORK ) 
	{	// PARA SETTING 
		struct ip_addr xdata ipaddr; 
 
		ipaddr.addr = 0xC0A8006F;					/*IP	= 192.168.0.111 */ 
		netif_set_ipaddr((struct ip_addr xdata *)&ipaddr); 
		ipaddr.addr = 0xFFFFFF00;					/*MASK	= 255.255.255.0 */ 
		netif_set_netmask((struct ip_addr xdata *)&ipaddr); 
		ipaddr.addr = 0xC0A80001;					/*GateW	= 192.168.0.001 */ 
		netif_set_gw((struct ip_addr xdata *)&ipaddr); 
		netif_set_up(); 
		etharp_query( &(netif->ip_addr), NULL ); 
	} 
	else 
	{	// WORKING STATE 
		if( CurWorkState & AUTO_NOT_MANUAL_IP ) 
		{	// DHCP CLIENT 
			dhcp_start(); 
		} 
		else 
		{	// MANUAL ALLOCATE IP 
			uchar xdata tmp[4]; 
			struct ip_addr xdata ipaddr; 
 
			ReadBytesFromFlash( STATIC_IP_ADDRESS, STATIC_IP_LEN, tmp); 
			ipaddr.addr = MAKE_LONG( MAKE_WORD(tmp[0],tmp[1]),MAKE_WORD(tmp[2],tmp[3])); 
			netif_set_ipaddr((struct ip_addr xdata *)&ipaddr); 
			ReadBytesFromFlash( NETMASK_ADDRESS, NETMASK_LEN, tmp); 
			ipaddr.addr = MAKE_LONG( MAKE_WORD(tmp[0],tmp[1]),MAKE_WORD(tmp[2],tmp[3])); 
			netif_set_netmask((struct ip_addr xdata *)&ipaddr); 
			ReadBytesFromFlash( GW_ADDRESS, GW_LEN, tmp); 
			ipaddr.addr = MAKE_LONG( MAKE_WORD(tmp[0],tmp[1]),MAKE_WORD(tmp[2],tmp[3])); 
			netif_set_gw((struct ip_addr xdata *)&ipaddr); 
			netif_set_up(); 
			etharp_query( &(netif->ip_addr), NULL ); 
		} 
	} 
	/* open TCP Listen Socket */ 
	StartListen(); 
	/*if TBOX is master,apply DYNAMIC_LIST memory and init this list*/	 
	if( (CurWorkState & MASTER_NOT_SLAVE) ) 
		init_dynamic_list(); 
} 
 
/**************************************************************************** 
* function: when state change, CLear curren state 
*****************************************************************************/ 
void EndCurrentState( void ) 
{ 
	// DHCP_CLIENT 
	if( CurWorkState & AUTO_NOT_MANUAL_IP ) 
		dhcp_stop(); 
	// Close Listen Socket 
	StopListen(); 
	// Close Self's Socket and RST remote TCP LINK 
	tcp_close_AllLink(); 
	EA = OFF; 
} 
		  
/************************************************************** 
master function 
****************************************************************/ 
void  m_uart( void ) 
{ 
	if(FrameDataReceived == END_RECEIVE) 
	{	 
		//queryIP_count = 0; 
		//master_com_flag = NO; 
		if( check_RCVdata() )   
		{ 
			MODBUS_analyse(); 
		} 
		RstRcvCommu(); 
	} 
	if(comm_send_protocol == TCP_PROTOCOL) 
	{ 
		if(master_sendcommdata_flag && (!master_com_flag)) 
			switch_message(); 
	} 
} 
 
/************************************************************************************ 
UART process 
*************************************************************************************/ 
void  s_uart( void ) 
{ 
	uchar i,offset,j; 
	uint len; 
	MEMB xdata *pd,*tmp; 
	if( FrameDataReceived == START_SEND ) 
	{	 
		pd = find_head(); 
		if( pd != NULL ) 
		{ 
			tmp = pd; 
			if(commDelyTime == 0 && !slave_send_flag) 
				commDelyTime = ReadByteFromFlash( COMM_SEND_DELYTIME ); 
			if(slave_send_flag) 
			{ 
				slave_send_flag = NO; 
				if( ( pd->tag & 0x40 ) == SERVE_TRANS_MESSAGE) 
				{ 
					head_info[0] = SERVE_TRANS_MESSAGE; 
					/*Transaction*/ 
					head_info[1] = pd->space[0]; 
					head_info[2] = pd->space[1]; 
					/*station num*/ 
					head_info[3] = pd->space[TCPMODBUS_LEN]; 
					/*ip+port+net type*/ 
					for(i = 0;i<7;i++) 
						head_info[i+4] = pd->space[i+9]; 
					len = MAKE_WORD(pd->space[4],pd->space[5]) - TRANS_COMMAND_LEN; 
					offset = TCPMODBUS_LEN + TRANS_COMMAND_LEN + 1; 
					// Copy Data to com buff 
					CommuBuffer[0] = pd->space[TCPMODBUS_LEN]; 
					j = 1; 
				} 
				else 
				{ 
					if(pd->space[0] == UDP_PROTOCOL) 
					{ 
						// Include Statio No 
						for( i=0; i<(UDP_DATA_STR + TCPMODBUS_LEN + 1); i++ ) 
							head_info[i] = pd->space[i]; 
						// UDP_DATA_STR+4กข5 is TCPMODBUS DATA AREA LEN 
						len = MAKE_WORD( head_info[UDP_DATA_STR+4],head_info[UDP_DATA_STR+5] ); 
						offset = UDP_DATA_STR + TCPMODBUS_LEN; 
					} 
					else 
					{// TCP 
						uchar ip_offset; 
						uint  ip_data_tmp; 
						for( i=0; i<(TCP_DATA_STR + TCPMODBUS_LEN + 1); i++) 
							head_info[i] = pd->space[i]; 
						/*remember ip and port*/ 
						i = pd->TCP_connect_num & 0x7F; 
			 			ip_offset = TCP_DATA_STR + TCPMODBUS_LEN + 1; 
						ip_data_tmp = HIGH_WORD( Manager_Tcp_Table[i].pPointTcp_Pcb->remote_ip.addr); 
						head_info[ip_offset] = HIGH_BYTE(ip_data_tmp); 
						head_info[ip_offset + 1] = LOW_BYTE(ip_data_tmp); 
						ip_data_tmp = LOW_WORD( Manager_Tcp_Table[i].pPointTcp_Pcb->remote_ip.addr); 
						head_info[ip_offset + 2] = HIGH_BYTE(ip_data_tmp); 
						head_info[ip_offset + 3] = LOW_BYTE(ip_data_tmp); 
						//port 
						head_info[ip_offset + 4] = HIGH_BYTE(Manager_Tcp_Table[i].pPointTcp_Pcb->remote_port); 
						head_info[ip_offset + 5] = LOW_BYTE(Manager_Tcp_Table[i].pPointTcp_Pcb->remote_port); 
						// connect num 
						head_info[ip_offset + 6] = pd->TCP_connect_num & 0x7F; 
						// UDP_DATA_STR+4กข5 is TCPMODBUS DATA AREA LEN 
						len = MAKE_WORD(head_info[TCP_DATA_STR+4],head_info[TCP_DATA_STR+5] ); 
						offset = TCP_DATA_STR + TCPMODBUS_LEN;	 
					} 
					// Copy Data to com buff 
					j = 0; 
				} 
				 
				while( pd ) 
				{ 
					for( ; offset < pd->size; offset++ ) 
					{ 
						CommuBuffer[j++] = pd->space[offset]; 
					} 
					pd = pd->link; 
					offset = 0; 
				} 
				// Free apply Memb 
				free_memb(tmp); 
				UART_out_time = UART_TIME; 
				RSTsend( len, CommuBuffer ); 
			} 
		} 
	} 
	else 
	{ 
		if( FrameDataReceived == END_RECEIVE  ) 
		{ 
			if( check_RCVdata() ) 
			{ 
				switch_message(); 
			} 
			FrameDataReceived = START_SEND; 
			out_affair_queue(); 
		} 
		if( FrameDataReceived == WAIT_RECEIVE ) 
		{ 
			if(UART_out_time == 0) 
			{ 
#ifdef   TESTDEBUG	 
test[13]++; 
#endif				 
				FrameDataReceived = START_SEND;	 
				out_affair_queue(); 
			} 
		}		 
	} 
	if(	com_flag ) 
	{ 
		switch_message();	 
	} 
} 
 
/******************************************************************************* 
* process data cash 
*******************************************************************************/ 
void apply_process(void) 
{ 
	uchar i,head; 
	for( i=0; iremote_ip.addr ); 
	} 
} 
 
/***************************************************************************************** 
 
*****************************************************************************************/ 
void init_dynamic_list( void ) 
{ 
	uchar head,offset; 
	MEMB xdata *pd; 
	head = apply_memb( STATION_IP_LISTSIZE ); 
	ip_station_list =  &( memory[head] ); 
	/*initlize list*/ 
	offset = 0; 
	pd = ip_station_list; 
	while( pd ) 
	{ 
		while( offset < pd->size ) 
		{ 
			pd->space[offset] = 0; 
			offset++; 
		} 
		pd=pd->link; 
		offset = 0; 
	} 
}