#ifndef LOG_MODULE_H__
#define LOG_MODULE_H__
#include "lnxall_list.h"
#include <time.h>
#define TRIGGER_LIST_MAX 8

#define MAX_LIST_NUM  1000

typedef enum
{
    LOG_CODE_PCS_GRID_ONOFF         =10001, //操作了PCS 1并2离网
    LOG_CODE_PCS_ONOFF              =10002, //操作了PCS 1开2关机
    
    LOG_CODE_NET_MONITOR            =30001, // 1:网线断线监控;2:路由变动监控;

    LOG_CODE_EMS_START              =70001,//系统启动
    LOG_CODE_DIAGNOSIS              =70002,//1自诊断开始共[%s]个诊断点
                                           //2步骤[%s/%s]-[%s]自诊断正常
                                           //3步骤[%s/%s]-[%s]自诊断异常
                                           //4自诊断完成,诊断通过[%s]项 未通过[%s]项
    LOG_CODE_SAVE_FILE              =70003, //保存文件[%s]
    LOG_CODE_REFLUSH_PLAN           =70004, //远程模式下检查更新了计划
    LOG_CODE_REFLUX                 =70005, //逆流锁定监控日志
    LOG_CODE_EMMS2_NO_CTRL_PERMISSON=70006, //云平台暂无控制权限
    LOG_CODE_IEC104_CONNECTION      =70007, //Iec104连接状态
    LOG_CODE_MODBUSTCP_CONNECTION   =70008, //ModbusTcp连接状态


    LOG_EMMS2_LOGIN                 =70101,//1 emms2登陆中
                                           //2 emms2登陆成功
    LOG_CODE_EMMS2_WRITE_POINT      =70102,//1emms2写点位
                                           //2emms2写点位失败

    LOG_CODE_EMMS2_WRITE_PLAN       =70103,//emms云更新了计划
    LOG_CODE_EMMS2_DISABLE_ALARM    =70104,//emms云更新了告警禁用列表
    LOG_CODE_EMMS2_READ             =70105,//1读取了ems只读数据
                                           //2读取了ems读写数据
                                           //3读取了设备的数据
                                           //4读取了全量告警
    LOG_EMMS2_NET                   =70106,//1 emms2网络未连接或断开
                                           //2 emms2网络连接成功
    LOG_CODE_NORTH_MQTT_WRITE_POINT  =70115,//1北向下发了控制
                                            //2北向控制失败 
    LOG_CODE_NORTH_MQTT_WRITE_PLAN  =70116,//北向更新了计划
    LOG_CODE_OPC_CLIENT_WTIRE       =70201,//写点位名称[%s]值[%s]
    LOG_CODE_OPC_FORMATE_DISK       =70202,//格式化磁盘
    LOG_CODE_OPC_UPGRADE            =70203,//升级
    LOG_CODE_OPC_RESTART            =70204,//重启软件
    LOG_CODE_OPC_REBOOT             =70205,//重启板子REBOOT
    LOG_CODE_OPC_WTITE_FILE         =70206, //写一个配置文件[%s]
    LOG_CODE_OPC_SET_TIMING         =70207, //校时
    LOG_CODE_OPC_FACTORY_DIAGNOSIS  =70208, //ua成功调用出厂设备诊断
    LOG_CODE_OPC_CAHRGE_DIAGNOSIS   =70209, //ua成功调用现场充放电诊断
    LOG_CODE_OPC_GFP                =70210, //1透传方法向[%s]设备发送了[%s]设备返回了[%s]
                                            //2透传方法向[%s]设备发送[%s]但是失败
    LOG_CODE_OPC_PING               =70211, //1操作PING [%s]成功
                                            //2操作PING [%s]超时
    LOG_CODE_OPC_CONSOLE            =70212, //1操作控制台输入[%s] 返回[%s]
                                            //2操作控制台输入[%s] 失败
    LOG_CODE_OPC_FILE               =70213, //1上传文件[%s]
                                            //2下载文件[%s]
}LOG_CODE_LIST;


typedef enum
{
    LOG_MODE_PERIOD = 0,
    LOG_MODE_TRIG
}LOG_MODE;

typedef struct 
{
    LOG_CODE_LIST log_code; //日志编码
    int handlers; //操作者
    char *no; //操作对象
    int value;//操作值
    char *add;//附加信息
    int trigger_list[TRIGGER_LIST_MAX]; 
    time_t raiseTime;
}ONE_LOG_INFO;

typedef struct 
{
    struct list_head list;
    ONE_LOG_INFO *log_info;
}LOG_MODULE;


typedef int (*get_log_cb)(ONE_LOG_INFO *log_info,void *contex);

int log_module_server_init();//初始化全局日志
int server_add_new_log(LOG_CODE_LIST log_code,char *no,LOG_MODE mode,int value,char *add);//全局日志添加信息
int period_state_clean(LOG_CODE_LIST log_code);//清除周期被禁止的周期日志，下次会触发
int get_all_log_num(); //获取日志数量

int log_module_client_init();//初始化全局日志客户端 返回一个句柄
//获取日志记录  fd小于0则获取所有的日志信息，fd存在则返回该fd未读取过的 起止范围内的日志信息并将该条标记为已读 
//读取到每条都会调用回调函数并传入相关信息。
int client_get_log_with_offset(int fd,int start_num,int num,get_log_cb get_log_cb_t,void *context);
#endif
