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

📄 rx_frame.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -