⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tc12.c

📁 select programe, 1 raw socket2 udp socket.
💻 C
字号:
#include "tc12mes.h"

//
//	TITLE:
//
//	DESCRIPTION:
//		definination of the icu
//	REFER to	none
//
//	FILENAME:
//		tc12.c
//
//	AUTHOR(S):
//		Andrew Dai(mailto:andrew.x.dai@gmail.com	)
//
//	CREATION DATE:
//		date from: 2007-5-11
//
//	MODIFICATION HISTORY:
//
//
//

void
showPacket()
{
	;
}

int
checkupPacket()
{
	return (peth->h_proto==SCOOTMRK?TRUE:FALSE);
}

int 
onPacket()
{
	TC12_packet_header_type *p1;
	TC12_message_type *p2;
	void *p3;

	showPacket();


	ptemp = packet_r_buf;										/*	resolve DATALINK layer header,	length=14 bytes */
	peth = (struct ethhdr *)ptemp;
	memcpy(ScootData.DMAC,peth->h_dest,6);
	memcpy(ScootData.SMAC,peth->h_source,6);
	memcpy(ScootData.DATA,ptemp,bytes_received);

	ptemp+= sizeof(struct ethhdr);							/*	resolve TC12_packet header,	 length=6 bytes	 */
	p1=(TC12_packet_header_type *)ptemp;
	TC12_MessageCounter=p1->message_counter;

#if  LEVEL(2)
	printf("message_counter=%02x\n",p1->message_counter);
	printf("packet_counter=%02x\n",p1->packet_counter);
	printf("first_packet=%02x\n",p1->first_packet);
	printf("last_packet=%02x\n",p1->last_packet);
	printf("reserver=%02x\n",p1->reserver);
	printf("bytes following=%02x\n",p1->bytes);
#endif

	if(p1->bytes<4) return TRUE;							/*	length of TC12_message >=<4	*/

	ptemp+= sizeof(TC12_packet_header_type);		/*	resolve TC12_message header,	 length=2 bytes	 */
	p2=(TC12_message_type *)ptemp;

#if LEVEL(2)
	printf("TC12_message_type=%02x\n",*p2);
#endif

	switch (*p2)
	{
		case TC12_announcement:
			if (checkDestInList())
			{
				memcpy(ScootMac,ScootData.SMAC,6);
				sendTC12_acknowledgement();
			}

		case TC12_acknowledgement:
		case TC12_configuration:
		case TC12_checked_data:
		case TC12_control_data:
		case TC12_reply_data:
		case TC12_error_message:
		case TC12_up_down_load_request:
		case TC12_up_down_load_reply:
		case TC12_up_down_load_error:
		case TC12_up_down_load_request2:
		default:
			;
	}

}

void
generatePacketHeader()
{
	ptemp = packet_s_buf;
	bzero(ptemp,MAXLINE);
	peth = (struct ethhdr *)ptemp;
	memcpy(peth->h_dest, ScootMac,6);
	memcpy(peth->h_source, MyMac,6);
	peth->h_proto=(size_2)SCOOTMRK;
}

void
sendTC12_acknowledgement()													/*	Connecting to scoot	*/
{
	TC12_packet_header_type *p1;
	TC12_message_type *p2;
	TC12_acknowledgement_message_type *p3;

	generatePacketHeader();

	ptemp = packet_s_buf;
	ptemp+= sizeof(struct ethhdr);							/*	resolve TC12_packet header,	 length=6 bytes	 */
	p1=(TC12_packet_header_type *)ptemp;

	p1->message_counter=TC12_MessageCounter;

	p1->packet_counter=0;
	p1->first_packet=1;
	p1->last_packet=1;
	p1->reserver=0;
	p1->bytes=15;

	ptemp+= sizeof(TC12_packet_header_type);		/*	resolve TC12_acknowledgement_message,	 length=2 bytes	 */
	p3=(TC12_acknowledgement_message_type *)ptemp;

	p3->message_type=TC12_acknowledgement;
	p3->instation_number=PCNUM;						/*	instation_number	*/
	p3->major_version=MAJORVERSION;
	p3->minor_version=MINORVERSION;
	p3->mains_input_failed=FALSE;						/* frequency from mains input in-phase with battery-backed clock	*/

	struct tm *local;
	local=getDateTime();
#if	LEVEL(3)
	printf("year=%d, mon=%d, day=%d, hour=%d, min=%d, sec=%d\n", \
			local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec);
#endif

	p3->year=local->tm_year+1900;		/* 年份,其值等于实际年份减去1900 */
	p3->month=local->tm_mon+1;		/* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */
	p3->day=local->tm_mday;				/* 一个月中的日期 - 取值区间为[1,31] */
	p3->hour=local->tm_hour;				/* 时 - 取值区间为[0,23] */
	p3->minute=local->tm_min;				/* 分 - 取值区间为[0,59] */
	p3->second=local->tm_sec;				/* 秒 – 取值区间为[0,59] */
	p3->hundredths=50;						/*	???				*/
#if	LEVEL(3)
	printf("size of TC12_acknowledgement_message_type=%d\n",sizeof(TC12_acknowledgement_message_type));
	printHex(p3,sizeof(TC12_acknowledgement_message_type),"TC12_acknowledgement_message packet=");
	printf("message_counter=%02x\n",p1->message_counter);
	printf("packet_counter=%02x\n",p1->packet_counter);
	printf("first_packet=%02x\n",p1->first_packet);
	printf("last_packet=%02x\n",p1->last_packet);
	printf("reserver=%02x\n",p1->reserver);
	printf("bytes following=%02x\n",p1->bytes);
#endif
	bytes_tosend=sizeof(struct ethhdr);
	bytes_tosend+=sizeof(TC12_packet_header_type);
	bytes_tosend+=sizeof(TC12_acknowledgement_message_type);
//	socket_addr_len=sizeof(packet_addr);			/*	??? this line cause to sendto failure	*/
	sendto(packet_fd, (char *)packet_s_buf, bytes_tosend, 0, (SA *)&packet_addr, socket_addr_len);
#if  LEVEL(2)
	printHex(packet_r_buf,bytes_received,"generate packet=");
#endif
}

void
sendR2()													/*	Getting configure	*/
{
}

int
checkDestInList()
{
	sprintf(tmpstr,"PC%03u",PCNUM);
	return (strstr(ScootData.DMAC, tmpstr)?TRUE:FALSE);
}

struct tm *
getDateTime()
{
	time_t t;
	t=time(NULL);
	return localtime(&t);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -