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

📄 gpsser.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         :  GpsSer.C                                    *
**  COPYRIGHT    :  (c) 2001 .Xiamen Yaxon NetWork CO.LTD       *
**                                                              *
**                                                              *
**  By : CCH 2002.1.15                                          *
****************************************************************/
#include "includes.h"
#include "bsp.h"
#include "tools.h"
#include "public.h"
#include "stream.h"
#include "sysframe.h"
#include "stream.h"
#include "rx_frame.h"
#include "sm_list.h"
#include "monitor.h"
#include "alarmer.h"
#include "gpsser.h"


static STREAM rstrm, *wstrm;
static INT16U hdlframelen;
static INT16U channeltype;
static SYSFRAME_STRUCT *hdlframe;

static MONITORENTRY_STRUCT monitorentry;


static void SetMonitorEntry_BASE(void)
{
    monitorentry.egcode      = GetEgcode_SYSFrame(hdlframe);
    monitorentry.mttellen    = DecodeTellen(hdlframe->STel, SYS_TELLEN);
    monitorentry.mttel       = hdlframe->STel;
}

static void SetMonitorEntry(void)
{
   HWORD_UNION temp;
    
    SetMonitorEntry_BASE();
    monitorentry.servicetype = ReadBYTE_Strm(&rstrm);
    monitorentry.monitortime = ReadHWORD_Strm(&rstrm);
    monitorentry.periodtime  = ReadHWORD_Strm(&rstrm);
    monitorentry.fixedspace  = ReadHWORD_Strm(&rstrm);
    
    ConvertData((INT8U *)&monitorentry.monitortime, sizeof(monitorentry.monitortime), 0x0, 0x7f);
    ConvertData((INT8U *)&monitorentry.periodtime,  sizeof(monitorentry.periodtime),  0x0, 0x7f);
    ConvertData((INT8U *)&monitorentry.fixedspace,  sizeof(monitorentry.fixedspace),  0x0, 0x7f);

    temp.hword = monitorentry.periodtime;
    temp.bytes.low &= 0x3f;
    monitorentry.periodtime = temp.hword;
}

/*
********************************************************************************
* Handler:  MSG_0x0101
********************************************************************************
*/
static void HdlMsg_0x0101(void)
{
    INT8U acktype;
    
    SetMonitorEntry();
    acktype = AddCommonMonitor(&monitorentry);
    
    ASMSYSFrameHead_MODE1(wstrm, hdlframe, 0x0141);
    WriteBYTE_Strm(wstrm, acktype);
    if (acktype == _ADD_SUCCESS) {
        MovStrmPtr(wstrm, QueryPosition(GetStrmPtr(wstrm)));
    }
    SendSYSFrame_MODE1(wstrm, hdlframe, SM_ATTR_SUCCESS | channeltype);
}

/*
********************************************************************************
* Handler:  MSG_0x0102
********************************************************************************
*/
static void HdlMsg_0x0102(void)
{
    INT8U acktype;
    
    SetMonitorEntry_BASE();
    if (DelCommonMonitor(&monitorentry)) {
        acktype = _SYSFRAME_ACK;
    } else {
        acktype = _SYSFRAME_NAK;
    }
    
    ASMSYSFrameHead_MODE1(wstrm, hdlframe, 0x0142);
    WriteBYTE_Strm(wstrm, acktype);
    SendSYSFrame_MODE1(wstrm, hdlframe, SM_ATTR_SUCCESS | channeltype);
}

/*
********************************************************************************
* Handler:  MSG_0x0103
********************************************************************************
*/
static void HdlMsg_0x0103(void)
{
    INT8U acktype;
    
    monitorentry.oldtellen = DecodeTellen(GetStrmPtr(&rstrm), SYS_TELLEN);
    monitorentry.oldtel    = GetStrmPtr(&rstrm);
    MovStrmPtr(&rstrm, SYS_TELLEN);
    SetMonitorEntry();
    
    if (ModifyCommonMonitor(&monitorentry)) {
        acktype = _SYSFRAME_ACK;
    } else {
        acktype = _SYSFRAME_NAK;
    }
    
    ASMSYSFrameHead_MODE1(wstrm, hdlframe, 0x0143);
    WriteBYTE_Strm(wstrm, acktype);
    SendSYSFrame_MODE1(wstrm, hdlframe, SM_ATTR_SUCCESS | channeltype);
}

/*
********************************************************************************
* Handler:  MSG_0x0104
********************************************************************************
*/
static void HdlMsg_0x0104(void)
{
}

/*
********************************************************************************
* Handler:  MSG_0x0105
********************************************************************************
*/
static void HdlMsg_0x0105(void)
{
    INT8U acktype;
    
    switch (ReadBYTE_Strm(&rstrm))
    {
        case 0x01:
            if (RespondAlarmer(TRUE)) {
                acktype = _SYSFRAME_ACK;
            } else {
                acktype = _SYSFRAME_NAK;
            }
            break;
        case 0x02:
            RespondAlarmer(FALSE);
            SetMonitorEntry_BASE();
            if (DelCommonMonitor(&monitorentry)) {
                acktype = _SYSFRAME_ACK;
            } else {
                acktype = _SYSFRAME_NAK;
            }
            break;
        case 0x03:
            RespondAlarmer(FALSE);
            monitorentry.oldtellen = DecodeTellen(hdlframe->STel, SYS_TELLEN);
            monitorentry.oldtel    = hdlframe->STel;
            SetMonitorEntry();
            
            if (ModifyCommonMonitor(&monitorentry)) {
                acktype = _SYSFRAME_ACK;
            } else {
                acktype = _SYSFRAME_NAK;
            }
            break;
        default:
            return;
    }
    
    ASMSYSFrameHead_MODE1(wstrm, hdlframe, 0x0152);
    WriteBYTE_Strm(wstrm, acktype);
    SendSYSFrame_MODE1(wstrm, hdlframe, SM_ATTR_SUCCESS | channeltype);
}

/*
********************************************************************************
* Handler:  MSG_0x0111
********************************************************************************
*/
static void HdlMsg_0x0111(void)
{
    ASMSYSFrameHead_MODE1(wstrm, hdlframe, 0x0151);
    if (CanMonitor()) {
        WriteBYTE_Strm(wstrm, _SYSFRAME_ACK);
        MovStrmPtr(wstrm, QueryPosition(GetStrmPtr(wstrm)));
    } else {
        WriteBYTE_Strm(wstrm, _SYSFRAME_NAK);
    }
    SendSYSFrame_MODE1(wstrm, hdlframe, SM_ATTR_SUCCESS | channeltype);
}

/*
********************************************************************************
* Handler:  MSG_0x0112
********************************************************************************
*/
static void HdlMsg_0x0112(void)
{
    INT16U querytime;
    
    querytime = ReadHWORD_Strm(&rstrm);
    ConvertData((INT8U *)&querytime, sizeof(querytime), 0x0, 0x7f);
    SetMonitorEntry_BASE();
    QueryCommonMonitor(&monitorentry, querytime);
}



static FUNCENTRY_STRUCT functionentry[] = { 0x0101,                 HdlMsg_0x0101,
                                            0x0102,                 HdlMsg_0x0102,
                                            0x0103,                 HdlMsg_0x0103,
                                            0x0104,                 HdlMsg_0x0104,
                                            0x0105,                 HdlMsg_0x0105,
                                            0x0111,                 HdlMsg_0x0111,
                                            0x0112,                 HdlMsg_0x0112
                                          };



void InformGpsSer(SYSFRAME_STRUCT *curframe, INT16U framelen, INT8U type)
{
    hdlframe    = curframe;
    hdlframelen = framelen - (sizeof(curframe->EGCODE) + sizeof(curframe->version) + sizeof(curframe->type) +
                  sizeof(curframe->DTel) + sizeof(curframe->STel) + 1);

    if (type == RX_FRAME_TCP) {
        channeltype = SM_ATTR_TCP;
    } else if (type == RX_FRAME_UDP) {
        channeltype = SM_ATTR_UDP;
    } else if (type == RX_FRAME_SM) {
        channeltype = SM_ATTR_SM;
    } else {
        channeltype = SM_ATTR_SM;
    }
    
    InitStrm(&rstrm, curframe->data, hdlframelen);
    wstrm = GetSYSFrameStream();
    FindProcEntry(GetType_SYSFrame(curframe), functionentry, sizeof(functionentry)/sizeof(functionentry[0]));
}

⌨️ 快捷键说明

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