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