📄 message.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 + -