/****************************************************************************
** File name    :  HTIEC61850Macros.h
** Description  :  IEC 61850 Macros define
** Create date  :  2019.09.01
** Auther by    :  Liuyx
** Version info :  V1.0.01
** Copyright (C) 2002-2019 xi'an huatek, Inc Co., Ltd
** Update record:
** DATE         AUTHER   DESC
** -------------------------------------------------------------------------
** 2019.09.01   Liuyx    first build
****************************************************************************/
#ifndef __HT_IEC_61850_MACROS_H
#define __HT_IEC_61850_MACROS_H
#include "HTGlobal.h"

#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus */

/************************************************************************************
* 关于comtrade文件配置文件的宏定义。
* 在此采用预定义最大个数方法，避免动态内存管理的问题。
*
* 相关字符串最大字符个数，一般不会超过16个；
* 模拟量端口最大个数，一般不会超过64个；
* 数字量量端口最大个数，一般不会超过64个；
* 采样率最大个数，一般不会超过8个；
*
************************************************************************************/

#define  CMTR_REV_YEAR_LENGTH           4
#define  CMTR_STRING_MAX_LENGTH         64
#define  CMTR_ANALOG_MAX_COUNT          255
#define  CMTR_DIGIT_MAX_COUNT           255
#define  CMTR_SMPRATE_MAX_COUNT         255

#ifdef _WIN32
    #define  f_open   _open
    #define  f_read   _read
    #define  f_write  _write
    #define  f_close  _close
#else
    #define f_open   open
    #define f_read   read
    #define f_write  write
    #define f_close  close
#endif

/************************************************************************************
* ht_cmtr_openrb/ht_cmtr_openwb/ht_cmtr_openab/ht_cmtr_close
*              - 可以根据需要改写该接口，如重定义为网口的recv\send、串口r\w等
* @pfd:  文件地址、缓冲区地址、或者socket地址等
* @str:  文件路径或者联机ip或者串口地址或者共享内存名称
*
************************************************************************************/
#define ht_cmtr_openrb(str)    (f_open((str), O_RDONLY, S_IWRITE | S_IREAD))
#define ht_cmtr_openwb(str)    (f_open((str), O_CREAT | O_RDWR, S_IWRITE | S_IREAD))
#define ht_cmtr_openab(str)    (f_open((str), O_CREAT | O_APPEND | O_RDWR, S_IWRITE | S_IREAD))
#define ht_cmtr_close(pfd)     (f_close(pfd))

//字节序高低位转换开关
//#define ENDIAN_CONIVER
    
// 宏开关 定义为文件读写
#define CMTR_IOFILE
//#define CMTR_IOBUFFER

// 是否输出txt的文本文件
//#define CMTR_OUT_TXTFILE

// 数据库操作类型
#define DB_OPT_INSERT   1
#define DB_OPT_UPDATE   2
#define DB_OPT_DELETE   3
/************************************************************************************
* 宏定义文件的读写操作，可以根据需要改写该接口，如重定义
* 为网口的recv\send、串口r\w等。
*
* ht_read_cmtr_bufn/ht_read_cmtr_bufn - cmtr的读写操作
* @pfd: 读写地址，可以为文件的fd、或者buffer地址等
* @buf: 缓冲区地址
* @count: 需要读写的字节数
*
************************************************************************************/
#if defined(CMTR_IOFILE)
    //typedef int _my_cmtr_ioptr;
#define ht_read_cmtr_bufn(pfd, buf, count)        \
    do {                                          \
        if (f_read((pfd), (buf), (count)) <= 0) { \
            (pfd) = -1;                           \
        }                                         \
    } while (0);

#define ht_write_cmtr_bufn(pfd, buf, count)       \
    do {                                          \
        if (f_write((pfd), (buf), (count)) <= 0) {  \
            (pfd) = -1;                           \
        }                                         \
    } while (0);

#define ht_check_cmtr_ptr(pfd)                    \
    (((pfd) != -1) && ((pfd) != 0))

#elif defined(CMTR_IOBUFFER)
    //typedef u8* _my_cmtr_ioptr;
    //typedef unsigned char* _my_cmtr_ioptr;
#define ht_read_cmtr_bufn(pfd, buf, count)      \
    do {                                        \
        memcpy((buf), (pfd), (count));          \
        (pfd) += (count);                       \
    } while (0);

#define ht_write_cmtr_bufn(pfd, buf, count)     \
    do {                                        \
        memcpy((pfd), (buf), (count));          \
        (pfd) += (count);                       \
    } while (0);

#define ht_check_cmtr_ptr(pfd)                  \
    (((pfd) != -1) && ((pfd) != 0))

#endif


/************************************************************************************
* ht_read_cmtr_data/ht_write_cmtr_data - 读取/写入并且转换cmtr数据。
* @src: 读写地址，为buffer地址；
* @data:  读取/写入的数据；
* @count: 需要读取/写入的字节个数；
* @counter:  读取/写入的字节计数器；
*
************************************************************************************/
#define ht_read_cmtr_data(src, data, count, counter)   \
    do {                                                \
        if (ht_check_cmtr_ptr(src)) {                  \
            ht_read_cmtr_bufn((src), (data), (count)); \
            (counter) += (count);                       \
        }                                               \
    } while (0);

#define ht_write_cmtr_data(src, data, count, counter)  \
    do {                                                \
        if (ht_check_cmtr_ptr(src)) {                  \
            ht_write_cmtr_bufn((src), (data), (count)); \
            (counter) += (count);                       \
        }                                               \
    } while (0);








#ifdef  __cplusplus
}
#endif
#endif /* end __HT_IEC_61850_MACROS_H */


