#ifndef ICE_BP_SHM_H
#define ICE_BP_SHM_H

//#include <QtCore>
#include <stdbool.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <stdlib.h>
#include <stdio.h>

#define SHM_PATH    "/"
#define SHM_PORT    8804
#define APP_NAME    "ytCore"

#define DB_PATH     "/opt/db"
#define CONF_DB     "/opt/db/yt_conf.db"
#define REC_DB      "/opt/db/yt_rec.db"
#define APP_ID      "f7e35a6f-76cc-4826-8dd6-1e1a0a9584c2"

#define CORE_MAIN       1
#define DB_THREAD       2
#define LOG_THREAD      3
#define UPCOMM_THREAD   4
#define DNCOMM_THREAD_0 5
#define USERVER_THREAD 6


typedef union {
    float f;
    unsigned char c[4];
}FC;

typedef struct {
    unsigned short YEAR;
    unsigned char MONTH;
    unsigned char DAY;
    unsigned char HOUR;
    unsigned char MINUTE;
    unsigned char SECOND;
    unsigned int TIMESTAMP;
}CurrentTime,FullTime;

typedef struct {
    unsigned char IDX;         //线程编号（1~63）
    unsigned char ENABLED;     //使能标识（0：不使能；1：使能）
    unsigned short WAITSEC;    //缓冲时长（1～65535，秒）
    unsigned int LASTFEED;      //末次喂狗时间（时间戳，单位秒）
}DogTime;

typedef struct {
    DogTime dogTime[64];
}DogTimeList;           //看门狗列表

typedef struct {
    unsigned char IDX;         //通信端口编号（0～3）
    unsigned char ENABLED;     //使能标识（0：不使能；1：使能）
    unsigned short CommType;   //通信类型（可作为多协议扩展使用）
    char PATH[255];     //端口路径（地址）
    unsigned char UNSAVED;
}Comm;

typedef struct {
    unsigned char STATUS;  //当前状态
    unsigned int TIMESTAMP; //状态改变时间
    bool SENT;   //告警发送标识
    unsigned char UNSAVED;
}CommStatus;

typedef struct {
    Comm comm[4];
}CommList;              //通信端口列表（嵌入式线程数量宜小于16）

typedef struct {
    CommStatus commStatus[4];
}CommStatusList;

typedef struct {
    unsigned char COMM_IDX;    //通信端口编号（0～3）
    unsigned char BUS_ADD;     //总线内监控点（1～254，0、255保留）
    unsigned char ENABLED;     //使能标识（0：不使能；1：使能）
    unsigned long SUB_TYPE; //子系统类别，0x00000001为火灾监控子系统，0x00000002为电气火灾监控子系统，0x00000004为消防水监控子系统，0x00000008为通道监控子系统，0x00000010为消防电源监控子系统
    char  NAME[220];    //监控点名词
    unsigned char PNO_TYPE;   //监控点物理类型， 0为不监控，1为开关量输入，2为模拟量输入，3为开关量输出，4为模拟量输出
    unsigned char PNO_ALARM; //监控点告警级别，0为不告警，1为次要告警，2为重要告警
    unsigned char PNO_VALUE;  //监控点数据类别，开关量输入时，0表示数值0为开或告警，1为关或正常；1表示数值1为开或告警，0为关或者正常。模拟量输入时，0表示无告警上下限，1表示只有告警上限，2表示只有告警下限，3表示有告警上下限。开关量输出时，0表示电平型，1表示脉冲型
    unsigned short PNO_DLY;     //当监控点具有告警属性时，为告警延时0～65535秒，当监控点为脉冲型开关量输出时，为保持时间1～65535秒
    unsigned char PNO_AD;         //监控点为模拟量输入、输出时，表示AD转换精度
    unsigned char OFFSET;             //偏移量，对AD值进行修正，以减少误差
    unsigned char OFFSET_FLAG;     //偏移方向，1为负，0为正
    float PNO_MAX;              //当监控点为模拟量时，表示满量程AD值代表的实际最大值
    float PNO_MIN;              //当监控点为模拟量时，表示AD值为最小时的实际最小值
    float ALARM_H;              //模拟量监控点告警上限
    float ALARM_L;              //模拟量监控点告警下限
    unsigned char UNSAVED;
}SPoint;

typedef struct {
    SPoint sPoint[4][256];
}SPointList;

typedef struct {
    float REALTIME_VALUE;
    unsigned int REALTIME_TIMESTAMP;
    unsigned char ALARM_STATUS;
    unsigned int ALARM_TIMESTAMP; //状态改变时间
    unsigned char ALARM_SENT;   //告警发送标识
    float MAX_VALUE;
    unsigned int MAX_TIMESTAMP;
    float MIN_VALUE;
    unsigned int MIN_TIMESTAMP;
    float TOTAL_VALUE;
    unsigned int COUNT;
    float AVE_VALUE;
    unsigned char UNSAVED;
}SpStatus;

typedef struct {
    SpStatus spStatus[4][256];
}SpStatusList;

typedef struct {
    char LocIP[40];
    char GateWay[40];
    char NetMask[40];
    char MacAddr[40];
    char UNSAVED;
} UnitNet;

typedef struct {
    unsigned short USKYPORT;
    char USKYID[40];
    char USKYSERIP[16];
    unsigned char Enabled[2];
}YT_SYS_SHM;

typedef struct {
    UnitNet unitNet;
    YT_SYS_SHM sysShm;
    CurrentTime currentTime;
    DogTimeList dogTimeList;
    CommList commList;
    SPointList sPointList;
    CommStatusList commStatusList;
    SpStatusList spStatusList;
}YT_UNIT_SHM;



#endif // ICE_BP_SHM_H
