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

📄 arithmetic.h

📁 嵌入式的小程序
💻 H
字号:
/*
 *文件:arithmetic.h
 *作者:黄峰
 *日期:
 *描述:提供基本算法的头文件
 *Copyright (C) 2002,深圳宝利达实业有限公司
 */
#ifndef _ARITHMETIC_H
#define _ARITHMETIC_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <unistd.h>
#include <pthread.h>
#include <math.h>
#include "../include/types.h"

//指令缓冲池结构定义
typedef struct comm_buf {
    STR_COMM accept_comm;
    struct comm_buf *next;
} COMM_BUF;
typedef COMM_BUF *COMM_LIST;


//发送指令缓冲池结构定义
typedef struct send_buf {
    STR_SEND send_comm;
    struct send_buf *next;
} SEND_BUF;
typedef SEND_BUF *SEND_LIST;

//定义临时接收缓冲节点
typedef struct tty_buf {
    BYTE data;
    struct tty_buf *next;
} TTY_BUF;
typedef TTY_BUF *TTY_LIST;



//一般算法
WORD chksum_generate(WORD * p_data, WORD i_datalength); //校验和计算
WORD swap_word(WORD word_reverse);      //转换字排列顺序的转换算法
UINT32 BCDtoDEC(BYTE * bcd_source, UINT32 len); //BCD码转换成十进制算法
INT8 get_bit_value(int status, INT8 bit);       //取指定位置的寄存器值

//指令缓冲池处理函数
int add_comm(void *pr_comm, int m_type);        //增加指令到缓冲池
int get_comm(void *pr_comm, int m_type);        //从缓冲池取指令
void free_buf(void);            //释放缓冲池

void tty_data_add(BYTE * m_data, int len);      //增加接收数据到串口接收临时缓冲区
int tty_data_get(BYTE * m_data, int len);       //从缓冲区取指定长度的节点
int tty_data_seek(BYTE * m_data, int len);
void tty_data_free(void);       //释放缓冲池

//*********************************************************
//平衡二叉树算法
/** AVL结点定义 **/
struct tree {
    unsigned char *Key;         /* 结点关键字 */
    void *Field;                /* 结点所包含的域指针 */
    struct tree *left_pointer;  /* 指向左儿子指针    */
    struct tree *right_pointer; /* 指向右儿子指针   */
    char bf;                    /* 平衡因子         */
};
typedef struct tree TREE;

/** 一棵AVL树的信息定义。**/
struct avl {
    unsigned short FieldSize;   /* 结点中域的大小 */
    TREE *Root;                 /* 此AVL树的根指针 */
    TREE *Result;               /* 执行AvlSelect后查询结果结点指针 */
    unsigned short ErrorCode;   /* 错误代码 */
    char ErrorInfo[100];        /* 错误文本信息 */
};
typedef struct avl AVL;

typedef struct {
    UINT32 process_no;          //集中器指令处理序列号
    UINT16 insname;             //指令码
    BYTE serial_no[5];          //主站指令流水号
} STR_SAVE;

//定义需响应指令的保存数据节点
typedef struct {                /* 结点的结构定义 */
    unsigned char Key[6];       /* 结点主键,必须是字符串,再这儿以指令的序列号代替 */
    STR_SAVE save_flag;         /* 保存发送指令标志 */
} SAVE_NODE;

#define RESULT(x,y,z) (((x *)(y->Result->Field))->z)    // 获取查询结果域的一个字段(x:域结构,y:AVL树指针,z:域字段名称)
#define	FIELD(x,y,z)  (((x *)(y->Field))->z)    // 一个AVL结点域的一个字段的获取(x:域结构,y:AVL结点指针,z:域字段名称)

void AvlInit(AVL * prTree, unsigned short FdSize);      // 初始化一棵AVL树
void AvlFree(AVL * prTree);     // 释放一棵AVL树
void AvlUpdate(AVL * prTree, unsigned char *OldKey, unsigned char *NewKey,
               void *NewFd);
                                                        //变更AVL树中一个结点的关键域
void AvlSelect(AVL * prTree, TREE * ptr, unsigned char *Key);   //从一棵AVL树中查询数据
void AvlInsert(AVL * prTree, void *NewFd, unsigned char *NewKey);       // 向一棵AVL树中插入一个结点
void AvlExport(AVL * prTree, TREE * ptr, void (*Func) (TREE * ptr1));   //以升序遍历一棵AVL树
int AvlDelete(AVL * prTree, unsigned char *OldKey);     //删除一棵AVL树中一个结点


#endif

⌨️ 快捷键说明

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