#ifndef _GLOBALDEF_H_
#define _GLOBALDEF_H_

#include "../_Lib-3.5/CMSIS/stm32f10x.h"
#include "./network/timeout.h"
#include "./network/nettimer.h"


#define READ_TIMER 3



#define UP_DEVICE_TYPE_GATE 0x0101 // 网关A
#define UP_DEVICE_FIRMWARE 0x03 // APP程序
enum {
    UPDATE_PROG_NULL = 0x00,
    UPDATE_PROG_FROM_NET = 0x01,
    UPDATE_PROG_FROM_GATEWAY = 0x02,
};
typedef struct _updata_prog {
    uint32_t sn[4];
    uint32_t appVr[4];
    uint8_t status[4];// 状态码
    uint16_t num;
    uint8_t upCount; // 上报的次数
    uint8_t updateProgFrom; // 升级程序的开源
    timeout_t upStatusOut;
    uint8_t rec0x16; // 接收到16指令，
    OS_TMR update_total_time;
}updateProg;
extern updateProg g_updateProg;


extern char g_upLinkTopic[64];

/* LED 灯的记录 */
#define LED_M_QUICK 1
#define LED_M_LOW 5

#pragma pack(push,1)
typedef union _LED_16_{
    uint16_t status;
    struct {
        uint16_t led01 : 1;
        uint16_t led02 : 1;
        uint16_t led03 : 1;
        uint16_t led04 : 1;
        uint16_t led05 : 1;
        uint16_t led06 : 1;
        uint16_t led07 : 1;
        uint16_t led08 : 1;
        uint16_t led09 : 1;
        uint16_t led10 : 1;
        uint16_t led11 : 1;
        uint16_t led12 : 1;
        uint16_t led13 : 1;
        uint16_t led14 : 1;
        uint16_t led15 : 1;
        uint16_t led16 : 1;
    }led;
}Led16;
#pragma pack(pop)
typedef struct _LED_STATUS_{
    uint8_t ledM; // M灯的情况 快闪还是慢闪
    Led16 led16;
    uint16_t collNum; // 采集器个数
}LedStatus;
extern LedStatus g_ledStatus;
/*时间信息记录*/
typedef struct _CUR_TICK_{
    uint32_t powerTime; // 上电时间
    uint32_t curTime; // 当前时间

}CurTick;
extern CurTick g_curTick;
typedef struct _FIRMWARE_EXPLAIN_{
    uint16_t dd;
    uint8_t ff;
    uint16_t nn;
}__attribute__((packed)) FirmwareExpl;
extern FirmwareExpl g_firmwareExpl;

#define UPDATE_COLLECT_TOTALTIME 90000 // 升级总的时间
#define UPDATE_CONTINUE_TIME 300 // 升级续传每条间隔的时候300毫秒
#define UPDATE_REPEAT_TIME  7000 // 接收重传超时的时间 2S
#define UPDATE_READSTATUS_TIME 10000 // 升级完成 到读取升级状态的时间
#define UPDATE_READSTATUS_TIME_GATEWAY 60000 // 升级完成 到读取升级状态的时间
/*运行数据*/
typedef struct _RUN_DATA_{
    uint16_t rssi_lora; // lora信息强度
    uint16_t rssi_4G; // 4G信息强度
    uint8_t timeSendStatus; // 第5分钟发送一次状态信息的标志 0：不发送 1：发送
    uint8_t bInitNetProc; // 是否创建网络队列
    uint16_t updateDeviceTyp; // 升级类型 0x0101：网关；0x0201；采集器：0x0301:液位仪采集器；0x0401：屏采集器
    uint8_t bUpdate; // 正在升级中
    uint32_t startUpdateTotalTime; // 重传开始时间记录
    uint32_t repeatUpdateTime; // 接收到重传指令型时间记录
    uint32_t readUpdateStatusTime; // 读取升级状态的时间记录
    uint8_t bsendOilData; // 发送油罐数据到服务器
    uint8_t bAutoReadOilData; // 自动读取油罐数据
    uint8_t bsendUpdateStatus; // 向服务器发送状态码
    uint8_t bResetUpdate; // 升级完成后，需要上报服务器
    uint8_t bsendGatewaySttus; //
    uint8_t bsendGatewayVersion;
    uint8_t frameNo; // 是否为多帧
    uint8_t cregStatus;  // 网络注册状态
    uint8_t bUpdateHost;  //是否是主设备  1：为主设备  其它为从设备，升级时，从设备不处理0x22指令
    uint16_t loraConnectTime;  // lora  连接的时间
    uint8_t bread; // 服务器下发的读取液位仪的指令
}RunData;
extern RunData g_runData;
typedef struct _DATA_4G_{
    uint8_t bconnect4G; // 是否连接4G
    uint8_t errorTime; // 4G断开的时间 如果断开1小时，则芯片复位重新启动
}Da4G;
extern Da4G g_data4G;

/* 网关固件信息存储 这个只有在产测时写入，要程序中不再写入*/
typedef struct _GATEWAY_HARDWARE_MSG_{
    uint8_t bInit; // 是否初始化过
    uint32_t gateway_sn; // 网关的sn
    uint16_t devicType;  // 类型
    uint16_t factoryMsg; // 厂家信息
    uint16_t seqNo ; // 生产批次号
    uint32_t data; // 生产日期
    uint8_t pcbVersion; // 硬件（PCB）版本
    uint32_t sqare; //备用
}__attribute__((packed)) GateHareWareMsg;

/* 网关的固件信息存储*/
typedef struct _GATEWAY_SOFT_MSG_{
    uint16_t bInit; // 是否配置过
    uint8_t coll_num; // 此网关对应采集器的数量
    uint16_t sqare; // 备用
}__attribute__((packed)) GateConfigMsg;
/* 网关的版本信息*/
typedef struct _GATEWAY_VERSION_MSG_{
    uint32_t gate_bootloaderVr; //网关的bootloaderVr
    uint32_t pt_version; // 产测版本
    uint32_t gate_appVr; // appt版本
    uint32_t gate_appVr2; // app2的版本
    uint32_t gate_appVr3; // app3的版本
}__attribute__((packed)) GateVersionMsg;

typedef union _VOLTAGE_{
    uint32_t voltage; // 电压
    float fvoltage;
}voltage;
typedef union _TEMPERATURE_{
   uint32_t temperature; // 温度
   float ftemperature;
}temperature;

typedef struct _GATEWAY_MSG_{
    GateHareWareMsg hardwareMsg; //
    GateConfigMsg configmsg; // 软件信息
    GateVersionMsg verMsg; // 版本信息
    uint32_t gate_resetnum; //复位次数
    uint8_t gate_resetType; //最后一次复位类型
    uint32_t gate_runTime; // 运行时长
    voltage fVol;
    temperature fTemper;
    uint8_t Uuid[12];//UUID
    uint8_t Imei[15]; //IMEI
    uint8_t Iccid1[20];//ICCID1
    uint8_t Iccid2[20];//ICCID2
    uint8_t Iccid3[20];//ICCID3
    uint16_t devicTypeID; // 103 303  这个是读取上来的

}GateWayMsg;
/* mqtt IP地址 端口号*/
typedef struct _MQTT_IP_PORT_{
    uint8_t flag;
    char port[6]; // 端口号
    char ip[32]; //IP地址
    char admin[8]; // 用户名
    char password[16]; // 密码
}__attribute__((packed)) MqttIdPort;

typedef struct _FIRMWARE_MSG_{ // 固件信息存储
    GateWayMsg gatewayMsg; // 网关固件信息
    MqttIdPort mqttidport; // mqtt的IP地址和端口
}FirmwareMsg;
extern FirmwareMsg g_firmwareMsg; // 网关 采集器固件信息存储

typedef struct _OIL_READ_MSG_{
    uint8_t bInit; // 是否初始化
    uint16_t paraLen; // 参数长度
    char param[48]; // 参数
}__attribute__((packed)) oilReadMsg;
extern oilReadMsg g_oilReadMsg;


typedef struct _run_mqtt_data_{
    uint8_t bChangeMqtt; // 1：为切换mqtt 服务器
    uint8_t bChangeSuc; // 0：初始值 1: 切换成功 2： 切换连接失败
    uint8_t connectNum;  // 连接次数
    uint8_t mqttIdlen;
    uint8_t mqttPortlen;
    uint8_t mqttUserlen;
    uint8_t mqttPwdlen;
    MqttIdPort mqttMsg; // mqtt的IP地址和端口
}__attribute__((packed)) MqttRunDa;
extern MqttRunDa g_mqttRunDa;

typedef struct{
        uint8_t oil_buff[1024]; //
        uint16_t len; //数据长度
        uint16_t len1; // 用于没有结束符的长度
        uint8_t bfinish; // 收到03 结束
        uint8_t bAutoRead; // 是否自动读取
        uint8_t bstart;   // 收到了 i20100指令
}__attribute__((packed))OilRunData;
extern OilRunData g_oilreadDa;
#endif
