📄 rx_frame.c
字号:
/****************************************************************
** *
** FILE : RX_FRAME.C *
** COPYRIGHT : (c) 2001 .Xiamen Yaxon NetWork CO.LTD *
** *
** *
** By : CCH 2002.1.15 *
****************************************************************/
#include "includes.h"
#include "bsp.h"
#include "structs.h"
#include "message.h"
#include "errcode.h"
#include "errtask.h"
#include "tools.h"
#include "list.h"
#include "gsmtask.h"
#include "sysframe.h"
#include "rx_frame.h"
#include "manser.h"
#include "gpsser.h"
#include "printer.h"
/*
********************************************************************************
* DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define NUM_MSG 10
#define SIZE_MSGBUF 160
/*
********************************************************************************
* DEFINE FRAME TYPE
********************************************************************************
*/
#define ERROR_EGCODE 0
#define ERROR_MYTEL 1
#define SERVICE_GPS 2
#define SERVICE_MANAGE 3
#define SERVICE_ATTEMPER 4
#define SERVICE_TAX 5
#define SERVICE_BLANK 6
/*
********************************************************************************
* DEFINE STRUCTURE OF RX_FRAME_STRUCT
********************************************************************************
*/
typedef struct {
INT8U type;
INT16U len;
INT8U buffer[SIZE_MSGBUF];
} RX_FRAME_STRUCT;
/*
********************************************************************************
* DEFINE MODULE VARIANT
********************************************************************************
*/
static LIST usedlist, freelist;
static struct {
NODE reserve;
RX_FRAME_STRUCT rx_frame;
} memory[NUM_MSG];
static void PrintRxFrame(RX_FRAME_STRUCT *rxframe)
{
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<receive data from system>\n");
if (rxframe->type == RX_FRAME_SM)
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<from short message>\n");
else
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<from GPRS>\n");
FormatPrintDataBlock(FORMAT_HEX, DEBUG_UARTNo_GSMSTATUS, rxframe->buffer, rxframe->len);
#else
rxframe = rxframe;
#endif
}
static INT8U ParseSYSFrame(SYSFRAME_STRUCT *curframe)
{
HWORD_UNION curtype;
ConvertEgcode(curframe);
curtype.hword = GetType_SYSFrame(curframe);
if (curtype.hword != 0x1001 && curtype.hword != 0x103c) {
if (!ChkMyTel_SYSFrame(curframe)) return ERROR_MYTEL;
if (!ChkEgcode_SYSFrame(curframe)) return ERROR_EGCODE;
}
if (curtype.bytes.high == 0x01) return SERVICE_GPS;
if (curtype.bytes.high == 0x05) return SERVICE_ATTEMPER;
if (curtype.bytes.high == 0x21) return SERVICE_ATTEMPER;
if (curtype.bytes.high == 0x22) return SERVICE_ATTEMPER;
if (curtype.bytes.high == 0x20) return SERVICE_TAX;
if (curtype.bytes.high == 0x10) return SERVICE_MANAGE;
if (curtype.bytes.high == 0x03) return SERVICE_MANAGE;
if (curtype.bytes.high == 0x06) return SERVICE_MANAGE;
if (curtype.bytes.high == 0x07) return SERVICE_MANAGE;
if (curtype.bytes.high == 0x14) return SERVICE_MANAGE;
if (curtype.bytes.high == 0x09) return SERVICE_MANAGE;
if (curtype.bytes.high == 0x0e) return SERVICE_MANAGE; //yyy
if (curtype.bytes.high == 0x0f) return SERVICE_MANAGE; //add by qzc
return SERVICE_BLANK;
}
static void DiagnoseProc(void)
{
if (!CheckList(&usedlist) || !CheckList(&freelist))
ErrExit(ERR_RXFRAME_LIST);
if ((ListItem(&usedlist) + ListItem(&freelist)) != sizeof(memory)/sizeof(memory[0]))
ErrExit(ERR_RXFRAME_MEM);
}
void InitRX_Frame(void)
{
InitList(&usedlist);
InitMemList(&freelist, (LISTMEM *)memory, sizeof(memory)/sizeof(memory[0]), sizeof(memory[0]));
InstallDiagProc(DiagnoseProc);
}
void DetectSysFrame(INT8U type, INT8U len, SYSFRAME_STRUCT *frame)
{
RX_FRAME_STRUCT *ptr;
if (len > sizeof(ptr->buffer)) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<system data is too long>\n");
#endif
return;
}
if ((ptr = (RX_FRAME_STRUCT *)DelListHead(&freelist)) != 0) {
ptr->type = type;
ptr->len = len;
memcpy(ptr->buffer, frame, len);
AppendListEle(&usedlist, (LISTMEM *)ptr);
OSQPost(GsmTaskMsgQue, MSG_RXFRANE_RECV, 0, 0);
} else {
ErrExit(ERR_RXFRAME_CLOG);
}
}
void RX_FrameEntry(void)
{
RX_FRAME_STRUCT *rxframe;
if ((rxframe = (RX_FRAME_STRUCT *)DelListHead(&usedlist)) == 0) return;
PrintRxFrame(rxframe);
if (rxframe->type != RX_FRAME_SM) {
if (!ChkSum_SYSFrame((SYSFRAME_STRUCT *)rxframe->buffer, rxframe->len)) {
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<system data checksum error>\n");
#endif
AppendListEle(&freelist, (LISTMEM *)rxframe);
return;
}
}
switch (ParseSYSFrame((SYSFRAME_STRUCT *)rxframe->buffer))
{
case ERROR_EGCODE:
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<system data egcode error>\n");
#endif
break;
case ERROR_MYTEL:
#if DEBUG_UARTNo_GSMSTATUS <= 3
PrintFromUART(DEBUG_UARTNo_GSMSTATUS, "<system data my telephone error>\n");
#endif
break;
case SERVICE_GPS:
InformGpsSer((SYSFRAME_STRUCT *)rxframe->buffer, rxframe->len, rxframe->type);
break;
case SERVICE_MANAGE:
InformManSer((SYSFRAME_STRUCT *)rxframe->buffer, rxframe->len, rxframe->type);
break;
case SERVICE_ATTEMPER:
InformManSer((SYSFRAME_STRUCT *)rxframe->buffer, rxframe->len, rxframe->type);
break;
case SERVICE_TAX:
break;
case SERVICE_BLANK:
break;
default:
;
}
AppendListEle(&freelist, (LISTMEM *)rxframe);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -