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

📄 dlccmd.c

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


/*
********************************************************************************
*                  DEFINE CONFIG PARAMETERS
********************************************************************************
*/
#define MAX_DLCCMD                          15


/*
********************************************************************************
*                  DEFINE MODULE VARIANT
********************************************************************************
*/
static LIST freecmdlist;
static struct {
    NODE            reserve;
    DLCCMD_STRUCT   cell;
} memory[MAX_DLCCMD];



static void InitCmd(DLCCMD_STRUCT *cmd)
{
    if (cmd != NULL) {
        cmd->ct_overflow = DLC_OVERFLOW;
        cmd->len         = 0;
    }
}

void FreeDLCCmd(DLCCMD_STRUCT *ptr)
{
    AppendListEle(&freecmdlist, (LISTMEM *)ptr);
}

DLCCMD_STRUCT *AllocDLCCmd(void)
{
    return (DLCCMD_STRUCT *)DelListHead(&freecmdlist);
}

DLCCMD_STRUCT *AllocDLCCmd_SABM(INT8U dlci, void (* informer)(INT8U, INT8U))
{
    DLCCMD_STRUCT *curcmd;
    			   
       
    if ((curcmd = AllocDLCCmd()) != NULL) {
        InitCmd(curcmd);
        curcmd->dlci       = dlci;
        curcmd->ct_send    = DLC_RESEND;
        curcmd->needresend = TRUE;
        curcmd->buffer[0] = DLC_FLAG;                           /* FLAG */
        curcmd->buffer[1] = (dlci << 2) | 0x03;                 /* Address */
        curcmd->buffer[2] = TYPE_SABM;                          /* Control Type */
        curcmd->buffer[3] = CalcCrc(&curcmd->buffer[1], 2);     /* FCS */
        curcmd->buffer[4] = DLC_FLAG;                           /* FLAG */
                                   
        curcmd->len       = 5;
        curcmd->ctltype   = curcmd->buffer[2];
        curcmd->informer  = informer;
    } else {
        ErrExit(ERR_DLCCMD_SABM);
    }
    return curcmd;
}
DLCCMD_STRUCT *AllocDLCCmd_DISC(INT8U dlci, void (*informer)(INT8U, INT8U))
{
    DLCCMD_STRUCT *curcmd;
    
    if ((curcmd = AllocDLCCmd()) != NULL) {
        InitCmd(curcmd);
        curcmd->dlci       = dlci;
        curcmd->ct_send    = DLC_RESEND;
        curcmd->needresend = TRUE;

        curcmd->buffer[0] = DLC_FLAG;                           /* FLAG */
        curcmd->buffer[1] = (dlci << 2) | 0x03;                 /* Address */
        curcmd->buffer[2] = TYPE_DISC;                          /* Control Type */
        curcmd->buffer[3] = CalcCrc(&curcmd->buffer[1], 2);     /* FCS */
        curcmd->buffer[4] = DLC_FLAG;                           /* FLAG */
        curcmd->len       = 5;
        curcmd->ctltype   = curcmd->buffer[2];
        curcmd->informer  = informer;
    } else {
        ErrExit(ERR_DLCCMD_DISC);
    }
    return curcmd;
}
DLCCMD_STRUCT *AllocDLCCmd_MSC(INT8U dlci, INT8U signal, BOOLEAN respond)
{
    DLCCMD_STRUCT *curcmd;
    
    if ((curcmd = AllocDLCCmd()) != NULL) {
        InitCmd(curcmd);
        curcmd->dlci           = dlci;
        if (respond) {
            curcmd->ct_send    = 1;
            curcmd->needresend = FALSE;
        } else {
           // curcmd->ct_send    = DLC_RESEND;
            //curcmd->needresend = TRUE;
             curcmd->ct_send    = 1;
            curcmd->needresend = FALSE;

            signal &= 0x8F;
        }
        signal |= 0x01;
        
        curcmd->buffer[0]  = DLC_FLAG;                          /* FLAG */
        if (respond){
            curcmd->buffer[1] = (0 << 2) | 0x01;                /* Address */
            curcmd->buffer[2]  = TYPE_UIH;
        }else{
           curcmd->buffer[1] = (0 << 2) | 0x03;                /* Address */
           curcmd->buffer[2]  = TYPE_UIH_RESPOND;              /* Control Type */
        }
        if (respond)
            curcmd->buffer[3] = TYPE_MSC | 0x01;                /* Command Type */
        else
            curcmd->buffer[3] = TYPE_MSC | 0x03;                /* Command Type */
        curcmd->buffer[4]  = 0x05;                              /* Length */
        curcmd->buffer[5]  = (dlci << 2) | 0x03;                /* DLCI */
        curcmd->buffer[6]  = signal;                            /* V.24 signals */
        //curcmd->buffer[7]  = 0x0 | 0x01;                        /* Break Signals */
        curcmd->buffer[7]  = CalcCrc(&curcmd->buffer[1], 2);    /* FCS */
        curcmd->buffer[8] = DLC_FLAG;                          /* FLAG */
        curcmd->len        = 9;
        curcmd->ctltype    = curcmd->buffer[2];
        curcmd->cmdtype    = curcmd->buffer[4];
        curcmd->informer   = NULL;
    } else {
        ErrExit(ERR_DLCCMD_MSC);
    }
    return curcmd;
}

void InitDLCCmd(void)
{
    InitMemList(&freecmdlist, (LISTMEM *)memory, sizeof(memory)/sizeof(memory[0]), sizeof(memory[0]));
}

void ResetDLCCmd(void)
{
    InitDLCCmd();
}

⌨️ 快捷键说明

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