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

📄 message.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
字号:
/*
 *  gps/message.c
 *
 *  Copyright (C) 2002 Asic Center
 *	
 *	2002-09-16	Created by Julias.
 *  
 *	"message.c" is the module to deal with the message which 
 *	is received from the GPS stars.
 */

#include <string.h>
#include "devmng.h"
#include "lmalloc.h"

#include "asixwin.h"
#include "sysmsg.h"

#include "measure.h"

BYTE NO20Address[100000];
BYTE NO22Address[100000];
BYTE NO23Address[100000];


extern const unsigned char message[];
unsigned char *mess = (unsigned char *)&message;

void MesServer( void );
int read_message( CMC_MESSAGE *cmc_message, MESSAGE_20 *mes20, int *read_length, int *head, int *offset, int *mesflag, int *rest_flag );
void deal_float( BYTE *Source, DOUBLE_S *Destination );
void deal_double_float( BYTE *Source, DOUBLE_S *Destination );

/*
 *	MesServer
 *
 *	Create a server task to read urat and manage the message recieved.
 */
void MesServer( void )
{
	U8			quit = 0, end = 1;
	PMSG		pmsg = (PMSG)Lmalloc(sizeof(MSG));
	MESSAGE_20	mes20, *msg_mes20;//msg_mes20用来保存传给应用任务的电文
//	BYTE		need;//读取多少数值后开始进行消息处理
	BYTE		buffer[250], *p;//保存从串口读出的数据。这儿缓冲区开得比所需读的大50,以保证数据不丢失
	BYTE		offset = 0;//每次开始保存到缓冲区中的起始偏移
	BYTE		rest_flag = NOREST;
//	CMC_MESSAGE	cmc_message;//暂存消息
	FLAG		flag;
	BYTE		read_length;//已保存的消息长度
#ifdef DEBUG
	BYTE		*point20 = (BYTE *)&NO20Address, 
				*point22 = (BYTE *)&NO22Address,
				*point23 = (BYTE *)&NO23Address;
#endif

	BYTE		*temp;
	BYTE		mesflag = 0;//标志有否读到20号电文
	BYTE		i = 0;
	ID			tskID = 0;//保存向它发消息的应用任务的ID号
	ROOT_DIR	root_dir;	

	temp = (BYTE *)Lmalloc( 0x47 );
//	root_dir.file_type = CMC_FILE;
//	root_dir.file_name = 

	while( !quit )
	{
		if( end )
			SysRecvMessage( pmsg, -1 );
		else
			SysRecvMessage( pmsg, 0 );

		tskID = pmsg->lparam;
		switch( pmsg->wparam )
		{
			case SM_END:
				end = 1;
				break;
			//启动读消息
			case SM_START:
				end = 0;
				SysReadDev( UART0_ID, buffer + offset, BUF_LEN, -1 );

				p = buffer;
				if ( !(*p == 1 && *(p + 1) == 0x14 && *(p + 2) == 0xeb && *(p + 3) == 0x47
					 || *p == 1 && *(p + 1) == 0x16 && *(p + 2) == 0xe9 && *(p + 3) == 0x49
					 || *p == 1 && *(p + 1) == 0x17 && *(p + 2) == 0xe8) )//buffer中开头一部分是断文
				{
					if ( rest_flag == REST )//说明buffer里有该断文前一段部分.且已经读出
					{
						switch( flag.type )
						{
							case 0x14:
								//补充完上次未读完的20号电文
								memcpy( (temp + read_length), p, (flag.length - read_length) );
								//开始提取20号电文
								mes20.hour = *temp & 0xf;
								mes20.minute = *(temp + 1);
								mes20.second = *(double *)(temp + 1);
			//					for ( j = 8; j > 0; j-- )
			//						buffer[j - 1] = *( temp + 2 + 8 - j );
			//					memset ( buffer, temp + 2, 8 );
			//					deal_double_float( buffer, &(mes20->second) );
								mes20.day = *(temp + 10);
								mes20.month = *(temp + 11);
#ifdef PC
								mes20.year = *(WORD *)(temp + 12);
#else
								mes20.year = *(temp + 12) << 8 || *(temp + 13);
#endif
			//					for ( j = 8; j > 0; j-- )
			//						buffer[j - 1] = *( temp + 14 + 8 - j );
			//					memset ( buffer, temp + 14, 8 );
			//					deal_double_float( buffer, &(mes20->latitude) );
								mes20.latitude = *(double *)(temp + 14);
			//					for ( j = 8; j > 0; j-- )
			//						buffer[j - 1] = *( temp + 22 + 8 - j );
			//					memset ( buffer, temp + 22, 8 );
			//					deal_double_float( buffer, &(mes20->longitude) );
								mes20.longitude = *(double *)(temp + 22);
#ifdef PC
								mes20.hdop = *(WORD *)(temp + 62);
								mes20.vdop = *(WORD *)(temp + 64);
#else
								mes20.hdop = *(temp + 62) << 8 || *(temp + 63);
								mes20.vdop = *(temp + 64) << 8 || *(temp + 65);
#endif
								mes20.star_num = *(temp + 67) & 0x7;
								//将20号全的电文存入存储器
//								memcpy( cmc_message->data, mes20, sizeof(MESSAGE_20) );
#ifdef DEBUG
								WriteRecord( temp, point20, flag.length );
								point20 += flag.length;
#else
								WriteRecord( temp, (BYTE *)Current_Address, flag.length );
								Current_Address += flag.length;
#endif
								mesflag = 1;
								break;
							case 0x16:
//								memcpy( (cmc_message->data + *read_length), p, (cmc_message->flag.length - *read_length) );
#ifdef DEBUG
								WriteRecord( p, point22, read_length );
								point22 += read_length;
#else
								WriteRecord( p, Current_Address, read_length );
								Current_Address += read_length;
#endif
							case 0x17:	//补充全上次未写完的22号或23号电文入结构体
//								memcpy( (cmc_message->data + *read_length), p, (cmc_message->flag.length - *read_length) );
#ifdef DEBUG
								WriteRecord( p, point23, read_length );
								point23 += read_length;
#else
								WriteRecord( p, Current_Address, read_length );
								Current_Address += read_length;
#endif
								break;
							default:
								break;
						}
						i = flag.length - read_length + 2;//buffer中已读的电文
					}
					else
						i = 0;
				}
				else
					i = 0;
				
				for ( i; i < 196; i++ )
				{
					//逐一判断是否是20\22\23号电文
					if ( *(p + i) == 1 && *(p + i + 1) == 0x14 
						&& *(p + i + 2) == 0xeb && *(p + i + 3) == 0x47 )//20号电文
					{
						flag.type = 0x14;
						flag.length = 0x47;
						read_length = flag.length;
						if ( i + 4 + read_length > 200 )//20号电文是断文
						{
							read_length = 200 - ( i + 4 );
							memcpy( temp, (p + i + 4), read_length );//只读取有效数据
							rest_flag = REST;
						}
						else//20号电文不断,直接提取,并读到结构体中
						{
							mes20.hour = *(p + i + 4) & 0x1f;
							mes20.minute = *(p + i + 5);
			//				for ( j = 8; j > 0; j-- )
			//					buffer[j - 1] = *( p + i + 6 + 8 - j );
			//					memset ( buffer, temp + 2, 8 );
			//					deal_double_float( buffer, &(mes20->second) );
			//				test = (double)(0x7fffffffffffffff);
			//				test = *(double *)( temp + 2 );
							mes20.second = *(double *)(p + i + 6);
							mes20.day = *(p + i + 14);
							mes20.month = *(p + i + 15);
#ifdef PC
							mes20.year = *(WORD *)(p + i + 16);
#else
							mes20.year = *(p + i + 16) << 8 || *(p + i + 17);
#endif
//							mes20.latitude = *(double *)(p + i + 18);
//							mes20.longitude = *(double *)(p + i + 26);
							mes20.latitude = ( *(double *)(p + i + 18) ) * 180 / 3.1415;//弧度转为角度
							mes20.longitude = ( *(double *)(p + i + 26) ) * 180 / 3.1415;
			//				mes20.hdop = (*(WORD *)(p + i + 66)) / 10;
			//				mes20.vdop = (*(WORD *)(p + i + 68)) / 10;
#ifdef PC
							mes20.hdop = *(WORD *)(p + i + 66);
							mes20.vdop = *(WORD *)(p + i + 68);
#else
							mes20.hdop = *(p + i + 66) << 8 || *(p + i + 67);
							mes20.vdop = *(p + i + 68) << 8 || *(p + i + 69);
#endif
							mes20.star_num = *(p + i + 71) & 0xf;
							read_length = flag.length;
//							memcpy( cmc_message->data, (p + i + 4), *read_length );//只读取有效数据
#ifdef DEBUG
							WriteRecord( (p + i + 4), point20, read_length );
							point20 += read_length;
#else
							WriteRecord( (p + i + 4), Current_Address, read_length );
							Current_Address += read_length;
#endif
							mesflag = 1;
							rest_flag = NOREST;
						}
						i = i + read_length + 6;
					}
					//22号电文.不管是否断文,都直接读取
					if ( *(p + i) == 1 && *(p + i + 1) == 0x16 
						&& *(p + i + 2) == 0xe9 && *(p + i + 3) == 0x49 )
					{
						flag.type = 0x16;
						flag.length = 0x49;
						read_length = 0x49;
						rest_flag = NOREST;
						if ( i + 4 + read_length > 200 )//22号电文是断文
						{
							read_length = 200 - ( i + 4 );
							rest_flag = REST;
						}
						
//						memcpy( cmc_message->data, (p + i + 4), read_length );//只读取有效数据
//						if ( read_length == flag.length )
//						{
#ifdef DEBUG
						WriteRecord( (p + i + 4), point22, read_length );
						point22 += read_length;
#else
						WriteRecord( (p + i + 4), Current_Address, read_length );
						Current_Address += read_length;
#endif
//						}
						i = i + read_length + 6;
					}
					//23号电文.不管是否断文,都直接读取
					if ( *(p + i) == 1 && *(p + i + 1) == 0x17 
						&& *(p + i + 2) == 0xe8 )
					{
						flag.type = 0x17;
						flag.length = *(p + i + 3);
						read_length = flag.length;
						rest_flag = NOREST;
						if ( i + 4 + read_length > 200 )//23号电文是断文
						{
							read_length = 200 - ( i + 4 );
							rest_flag = REST;
						}
						
//						memcpy( cmc_message->data, (p + i + 4), *read_length );//只读取有效数据
//						if ( *read_length == cmc_message->flag.length )
//						{
#ifdef DEBUG
						WriteRecord( (p + i + 4), point23, read_length );
						point23 += read_length;
#else
						WriteRecord( (p + i + 4), Current_Address, read_length );
						Current_Address += read_length;
#endif
//						}
						i = i + read_length + 6;
					}
				}
				if ( i == 196 )
				{
					for ( i, offset = 0; i < 200; i++, (offset)++ )
						buffer[offset] = buffer[i];
					i = 0;
				}
				if ( mesflag == 1 && tskID != 0 )//读到20号电文
				{
//					pmsg->message = SM_DATA_RECEIVED;
					pmsg->message = SM_AT;
					msg_mes20 = (MESSAGE_20 *)Lmalloc( sizeof(MESSAGE_20) );
					memcpy( msg_mes20, &mes20, sizeof(MESSAGE_20) );
					pmsg->data = (LPVOID)(msg_mes20);
//					memcpy( pmsg->data, &mes20, 0x47 );
					SysSendMessage( tskID, pmsg );
				}
			break;
		default:
			break;
		}
	}
}

⌨️ 快捷键说明

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