#ifndef __UPLINK_H__
#define __UPLINK_H__

#include "stm32f10x.h"
#include "../dev_mgr/taxctrl/tax_ctrl.h"
// 设备类型
enum {
    DEVICE_GATEWAY = 0x0101, // 网关
    DEVICE_COLLECT = 0x0201, //采集器
    DEVICE_OILL    = 0x3001, //油罐车
    DEVICE_LED     = 0x0401, // 显示屏
};


#define GATEWAY_ID  0X01

#define TAX_UPLINK_LEN 34

#define TAX_UPLINK_TYPE 0X20 // 上行

#define FIRST_TYPE_SYST 0x01 // 系统类
#define FIRST_TYPE_STATUS 0x02 // 状态类
#define FIRST_TYPE_DATA 0x03 //数据类
#define FIRST_TYPE_TEST 0x04 // 产测类
#define FIRST_TYPE_LOG  0x10 // 异常类

// 系统类数据 0x01
enum {
    COLL_DN_SYS_CMD1001 = 0x1001,  // 升级下行
    COLL_DN_SYS_CMD1002 = 0x1002,  // 连接器版本同步，即采集器给另一个采集器升级

    COLL_DN_SYS_CMD1011 = 0x1011, //系统类 采集路由信息初始化下行
    COLL_DN_SYS_CMD1012 = 0x1012, // 系统类，刷新税控序列号
    COLL_DN_SYS_CMD1021 = 0x1021, // 系统类，系统重新启动

    GATEWAY_DN_SYS_CMD1003 = 0x1003, // 系统类，配置mqtt服务器


    GATEWAY_DN_SYS_CMD1013 = 0x1013, // 系统类， 时间轮询间隔

    COLL_DN_SYS_CMD1016 = 0x1016, // lora参数切换
    COLL_DN_SYS_CMD1017 = 0x1017, // lora参数读取
    GATEWAY_DN_SYS_CMD1018 = 0x1018,  // 手动刷新税控序列号
    COLL_DN_SYS_CMD1019 = 0x1019,   // 系统类，带显示屏或不带显示屏的路由信息初始化下行
    COLL_DN_SYS_CMD1020 = 0x1020,    // 配置报税口枪的个数
    GATEWAY_DN_SYS_CMD1022 = 0x1022, // 是否启用编码器路由表
    COLL_DN_SYS_CMD1023    = 0x1023, // 采集器设备设置
    COLL_DN_SYS_CMD1034    = 0x1034, // 读取报税口数据
    GATEWAY_DN_SYS_CMD1051 = 0x1051, // 拓盛密文实时读取
    GATEWAY_DN_SYS_CMD1052 = 0x1052, // 透传
    GATEWAY_DN_SYS_CMD1053 = 0x1053, // 透传


    COLL_UP_SYS_CMD2001 = 0x2001, //  升级状态上行

    COLL_UP_SYS_CMD2011 = 0x2011, // 系统类0x2011数据上报

    COLL_UP_SYS_CMD2017 = 0x2017, // lora参数上报
    GATE_UP_SYS_CMD2051 = 0x2051, // 拓盛密文实时上报应答
};
// 状态类信息  0x02
enum {
    COLL_DN_STATUS_CMD1001 = 0x1001, // 状态类  固件信息下行

    COLL_UP_STATUS_CMD2001 = 0x2001, // 固件信息
    COLL_UP_STATUS_CMD2002 = 0x2002, // 状态信息上行
};
// 数据类 0x03
enum {
    COLL_TAX_DA_CMD_UP = 0x2001, // 业务数据上报
    COLL_TAX_DAER_CMD_UP = 0x2002, // 业务错误数据上报
    COLL_ENCODER_DA_CMD_UP = 0x2051, // 编码器数据上报
    NET_UP_DATA_CMD2071 = 0x2071, // 密文原始数据上季
};
// 异常类 0x10
enum {
    LOG_BASIC_MSG = 0x01, // 收到开启日志消息，回路由表的基本信息
    LOG_TAX_DA    = 0x02, // 上传错误信息
    LOG_TAX_COLLSN = 0x03, // 上报不是本采集器的SN
    LOG_LORA_ERROR = 0x04
};
enum {
    GATEWAY_DN_LOG_CMD1001 = 0x1001,  //异常类开启或关闭
    GATEWAY_DN_LOG_CMD1002 = 0x1002, // 异常原始数据
    GATEWAY_UP_LOG_CMD2001 = 0x2001, //异常类上行
};
/*业务数据（0x03)上报服务器 0x2001*/
typedef struct _uplink_tax
{
    uint32_t gateway_id; //网关id
    uint32_t collect_id;  //采集器id
    uint8_t tax_no;  // 报税口编号
    uint8_t gun_no;  // 枪号
    uint32_t seq_no;  // 流水号
    uint8_t time_day; // 日
    uint8_t time_hour; // 时
    uint8_t time_minute; //分
    uint32_t oil_volume;//当次加油量
    uint32_t price;//当次金额
    uint32_t unit_price;//单价
    uint64_t total_oil_volume;  //总油量
    uint64_t total_price; //总金额
}__attribute__((packed)) uplink_tax_t;
/* 业务数据的错误数据 */
typedef struct _uplink_tax_errror {
    uint32_t gateway_id; //网关id
    uint32_t collect_id;  //采集器id
    uint8_t tax_no;  // 报税口编号
    uint8_t gun_no;  // 枪号
    uint8_t errorcode; // 错误码
    uint32_t reserve;
}__attribute__((packed)) uplink_tax_error_t;

/* 编码器数据（0x03) 上报服务器 0x2051 */
typedef struct _updata_encoder_0x2051_{
    uint32_t gateway_id; //网关id
    uint32_t collect_id;  //采集器id
    uint8_t taxno;        // 报税口号
    uint8_t gunno;       // 枪号
    uint32_t reserve;     // 预留
    uint8_t paralen;      // 参数长度
    uint8_t para[100];    // 参数
}__attribute__((packed)) updataencoder0x2051;
/* 密文原始数据（0x03）上报服务器 0x2071 */
typedef struct _data_cmd_0x2071_{
    uint32_t gatewaySn; //网关id
    uint32_t collSn;  //采集器id
    uint8_t taxId;        // 报税口号
    uint8_t gunId;       // 枪号
    uint32_t serialNo;   // 流水号
    uint8_t dir;         //0：解码数据返回结服务器  1：解码数据返回给数据源设备
    uint8_t free_fifo;   // 解码主板，可用资源数。即接收缓冲区还能够存放多少 条 数据包。
    uint8_t  result;     // 解码结果
    uint8_t  shakedown1[3]; // 解码调度信息

    uint8_t serialNum[10]; // 税控序列号
    uint32_t reserve;     // 预留
    uint8_t da14len;     // 8C-14的数据长度
    uint8_t da11len;     // 8C-11的数据长度
    uint8_t data[128];
}__attribute__((packed)) dataCmd0x2071;
/*  系统信息(0x01)上报 0x2011 指令*/
typedef struct _syscmd_0x2011_{
    uint32_t gateway_sn; // 网关编号
    uint32_t coll_sn;  // 采集器编号
    uint8_t  tax_no; // 报税口编号
    char minor_num[10]; // 税控序列号
    uint8_t tax_factory; // 税控厂家
    uint8_t encrypt; // 加密状态
    uint8_t gun_num;  // 枪的个数

}__attribute__((packed)) syscmd0x2011;
/* 系统升级状态信息(0x01)上报 0x2001 */
typedef struct _syscmd_0x2001_{
    uint16_t targetType; // 设备类型
    uint32_t deviceSn; // 设备SN号
    uint16_t taskNo; // 任务号
    uint8_t status;   // 当前状态
}__attribute__((packed)) syscmd0x2001;
/* 系统信息（0x01) 上报0x2017 指令 lora信道信息 */
typedef struct _syscmd_0x2017_{
    uint32_t gateway_sn; // 网关编号
    uint32_t coll_sn;    // 采集器编号
    uint8_t result ;     // 结果
    uint8_t loraIndex;   // lora通道号
    uint32_t freq;       // lora 发射频率
    uint8_t power;       // 发射功率
    uint8_t bandwidth;   // 带宽
    uint8_t spreadingfactor; // 扩频因子
    uint8_t codingrate;     // 纠错编码率
    uint16_t preambleLen;    // 前导码长度
}__attribute__((packed)) syscmd0x2017;

/* 拓盛密文实时读取 0x1051*/
typedef struct _syscmd_0x2051_{
    uint32_t gateway_sn; // 网关SN
    uint32_t coll_sn;    // 采集器sn号
    uint8_t  taxNo;      // 报税口号
    uint8_t  benable;    // 是否启用时实读取 0：非时实 1：时实
    uint32_t reserve;    // 预留
}__attribute__((packed)) syscmd0x2051;


/* 状态信息类0x02 上报 固件信息消息 0x2001 */
typedef struct _status_cmd_0x2001_{
    uint32_t gateway_Sn; //网关编号
    uint16_t target_Type;//设备类型（0x0101：网关；0x0201；采集器：0x0301:液位仪采集器；0x0401：屏采集器）
    uint32_t sn	;//设备SN
    uint32_t bootloader_Version; //bootloader版本
    uint32_t app_Version;//APP版本
    uint32_t reset_Times;//复位次数
    uint8_t last_Reset_Type;//最后一次复位类型
    char Uuid[12];//UUID
    char Imei[15]; //IMEI
    char Iccid1[20];//ICCID1
    char Iccid2[20];//ICCID2
    char Iccid3[20];//ICCID3
}__attribute__((packed)) statusCmd0x2001;

/*状态信息类0x02 上报 状态信息0x2002*/
typedef struct _status_cmd_0x2002_{
    uint32_t gateway_sn;// 网关编号
    uint16_t target_Type;//设备类型（0x0101：网关；0x0201；采集器：0x0301:液位仪采集器；0x0401：屏采集器）
    uint32_t sn; //编号
    uint32_t run_Time;//运行时常
    uint32_t voltage; // 电压
    uint32_t tempperature; // 温度
    uint8_t loraPaIndex;  // lora信道的索引 用的为第几号信道
    uint16_t rssi_lora;//Lora信号强度（+1000）
    uint16_t loraSendNum; // lora发送包个数
    uint16_t loraRcvNum; // lora接收包个数
    uint16_t rssi_4G;//4G信号强度
    uint8_t status;//状态(0x00：离线；0x01：在线)
    uint8_t taxstatus[2]; // 两个报税口的状态(0x00:离线  0x01:在线)
    //uint32_t reserver; // 预留
    uint8_t data;  // 网关时，发送为编码器路由表是否启用，采集器时，明文密文状态
    uint16_t collerr; // 不是本网关下出现采集器的次数
    uint8_t reserve; //预留
}__attribute__((packed)) statusCmd0x2002;

extern int uplink_tax_comb_error(uint8_t *outdata,uint8_t *len, uint8_t node,uint8_t port,uint8_t gun,uint32_t id,uint8_t flag);
extern int uplink_tax_comb(uint8_t *outdata, uint8_t *len, uint8_t node, uint8_t port, uint8_t gun, uint32_t seq_no);
extern int uplink_tax_comb_2002(uint8_t *outdata,uint8_t *len, uint8_t node,uint8_t port,uint8_t gun,uint8_t errorcode);
extern void uplink_tax_systemcmd_0x2011(uint8_t *outdata,uint8_t *len, uint8_t node,uint8_t port,uint8_t gun);
extern void uplink_update_systemcmd_0x2001(uint8_t *outdata, uint8_t *len, uint16_t type, uint32_t sn, uint16_t taskNo, uint8_t status);
extern void uplink_update_systemcmd_0x2017(uint8_t *outdata,uint8_t *len,uint32_t coll_sn,uint8_t result,uint8_t index);
extern void uplink_tax_statusmcmd_0x2001(uint8_t *outdata, uint8_t *len, uint16_t type, uint8_t index);
extern void uplink_tax_statusmcmd_0x2002(uint8_t *outdata,uint8_t *len, uint16_t type,uint8_t index);
extern void uplink_encoder_data0x2051(uint8_t *outdata, uint8_t *len, uint8_t node, uint8_t port, uint8_t gun, uint16_t palen, uint8_t *da);

extern void uplink_data_cmd_0x2071(uint8_t *outdata, uint8_t *len, uint32_t serialNo, uint8_t cIndex, uint8_t portId, uint8_t gunId,rcv_data_0x8C_t * msg);

extern void uplink_tax_log_da(uint8_t *outdata,uint8_t *len, uint8_t type,uint8_t node,uint8_t port,uint8_t gun,uint32_t id,uint8_t cmd,uint8_t err);
extern void uplink_update_systemcmd_0x2051(uint8_t *outdata,uint8_t *len,uint32_t coll_sn,uint8_t taxno,uint8_t benable);

#endif

