#ifndef __TXH_H__
#define __TXH_H__

#define QUEUE_SIZE 10

typedef struct spu_info
{
  union
	{
	  u8 byte[12];
		u32 id[3];
	  }v;
}cup_t;
typedef union
{
	u16 State;
	struct
	{
	  u8 e_errFlashParameter    : 1;			//FLASH断线
	  u8 e_errFramParameter     : 1;			//铁电参数错误
    u8 e_errPCBCheck          : 1;			//电路板验证
	  u8 e_errMessageEnd        : 1;
	 }Flag;
}ErrState_TypeDef;
__packed typedef struct
{
	u8 Sec;
	u8 Min;
	u8 Hour;
	u8 Day;
	u8 Month;
	u8 Year;
}CTIME_type; 

typedef enum
{
	Message_Priority_1 = 1,
	Message_Priority_2,
  Message_Priority_3 ,
}Message_PriorityItem;

typedef struct Message {
    u8 Priority;   // 消息优先级，1-3之间的整数
    u8 Content;   // 消息内容
}Message_Type;

typedef struct MessageQueue {
    u8 Front;      // 队头指针
    u8 Rear;       // 队尾指针
    Message_Type Messages[QUEUE_SIZE];   // 消息队列数组
}MessageQueue_Type;
__packed typedef union
{
	u8 Buff[16];
	__packed struct
	{
		float OH;
	  float OV;
	  float WH;
	  float TH;
	  }Data;
}TankData_Type;
__packed typedef union
{
	u8 State;
	__packed struct
	{
		u8 TankLeaked           : 1;
		u8 GasLeakage           : 1;
		u8 THOutOfLimits        : 1;
		u8 TLOutOfLimits        : 1;
		u8 PHHOutOfLimits       : 1;
		u8 PLLOutOfLimits       : 1;
		u8 Electrostatic        : 1;
		u8 beiyong              : 1;
		
	 }Flag;
	}TankState_Type;
__packed typedef struct
{
	u32 OilCNT ;      //实时油量
	u32 MoneyCNT ;    //实时金额
}FData_Type;//8byte

__packed typedef struct
{
	u64 TotalLit;    //油量总累
	u64 TotalMoney;  //金额总累
}CTOTAL_Type;//16byte

__packed typedef struct
{
	u8          GunNumber;    //枪号
  FData_Type  FData;        //加油数据
	u32         Price;        //单价
	CTOTAL_Type CTOTAL;       //累计
	CTIME_type  RTIME;        //完成时间
	u32         OrderNumber;  //订单号，离线授权的话为0
	u8          CardNum[6];    //卡号  6BYTE BCD
	u8          Standby[51];    //预留
}PREXDATA_Type;//
typedef struct
{ 
	u8  PrintBuff[20][32];
}PrintInfo_Type;
typedef union  
{
	u8 State;
	struct
	{
		u8              : 1;        //
	  u8              : 1;				//
	  u8              : 1;				//
		u8 TitleFlag    : 1;        //受控标志1受控0自控
	  u8              : 1;	      //
	  u8 StartFlag    : 1;				//开机标志1开机0停机
	  u8 Pause        : 1;				//暂停
	  u8 GunUp        : 1;			  //提枪
	}Flag;
}fuelState_TypeDef;
typedef union
{ 
	u8 Buff[10];
	__packed struct
	{
		float Longitude;      //经度
		u8    LongitudeType;  //经度类型
		float Latitude  ;     //纬度
		u8    LatitudeType  ; //纬度类型
	}GPS;
}GPS_Type;
typedef enum
{
	Display_664,
  Display_886,

}Display_Typ;
typedef enum
{
	YWY_Bluesky,
  YWY_Probe_KY,
	YWY_Pressure,

}YWY_Typ;
typedef enum
{
  Preset_Sale,
  Preset_Volume,
}Preset_Typ;
typedef enum
{
	POS_Connect_Typ_Station,
	POS_Connect_Typ_Cloud,
	POS_Connect_Typ_Cloud_Tast,
	//POS_Connect_Typ_WifiStation,
	
	POS_Connect_Typ_End,

}POS_Connect_Typ;
typedef enum
{
	POS_Net_Typ_4G_GM5,
	POS_Net_Typ_4G_L510,
	POS_Net_Typ_WiFi,
	POS_Net_Typ_WAN,
	
	POS_Net_Typ_End,

}POS_Net_Typ;
typedef enum
{
	PosNormal,
  PosBlueSky,
	PosLY,
	PosJP,
	PosDart,
	PosYWY,
	PosRFID,
	PosYGao,
	PosHongYang,
	PosSSLan,
	PosBlueSkyPlus,
	PosPLC,
	PosPrice1_4,
	PosLanFeng,
  
}PosItem;
typedef enum
{
	At45DB041,
	At45DB321,
  At45DB641,
}At45DBTypeItem;
typedef union  
{
	u8 State;
	struct
	{
		u8 State        : 2;
	  u8 PresetType   : 2;				//
	  u8 PresetMode   : 1;	      //
	  u8 UpdateRecords: 1;				//有信息标志1
	  u8 Unit         : 1;				//
	  u8 GunUp        : 1;			  //提枪标志1提枪0挂枪
	}Flag;
}YGGunState_TypeDef;
typedef union  
{
	u8 State;
	struct
	{
		u8 GunNum       : 3;//抢号
	  u8 State        : 1;				//状态0挂枪1提枪
	  u8 Null         : 4;	      //
	}Flag;
}DartGunState_TypeDef;
typedef union  
{
	u8 State;
	struct
	{
		u8              : 1;
	  u8 ErroFlag     : 1;				//有错误标志
	  u8              : 1;				//1有未上传记录0没有
		u8 TitleFlag    : 1;        //受控标志1受控0自控
	  u8 BatteryFlag  : 1;	      //电池电量标志1有电0没电
	  u8 StartFlag    : 1;				//开机标志1开机0停机
	  u8 EventFlag    : 1;				//有事件标志
	  u8 GunUp        : 1;			  //提枪标志1提枪0挂枪
	}Flag;
}LTGunState_TypeDef;
typedef union  
{
	u8 State;
	struct
	{
	  u8 PriceChange  : 1;			  //单价变更
		u8 ShiftChange  : 1;				//班累变更
		u8 TotalChange  : 1;				//总累变更
		u8 StartFlag    : 1;	      //加油中
		u8 TitleFlag    : 1;        //受控状态
		u8 GunUp        : 1;				//提枪状态
		u8              : 1;
	  u8              : 1;				//
	}Flag;
}HYState_TypeDef;
typedef union  
{
	u8 State;
	struct
	{
	  u8              : 1;			  //
		u8              : 1;				//
		u8              : 1;				//
		u8              : 1;	      //
		u8 GunUp        : 1;        //提枪状态
		u8              : 1;				//
		u8              : 1;
	  u8              : 1;				//
	}Flag;
}HYSelfTestState_TypeDef;
typedef union  
{
	u8 State;
	struct
	{
		u8 GunUP_Flag    : 1;				//提枪状态
		u8 Start_Flag    : 1;	      //启动状态
		u8 UpdateDisplay : 1;				//需更新数据
		u8 UpdateRecords : 1;			  //需入库  //慎重，非油机设备不要用这个标志
		u8               : 1;       //
		u8 AuthorizeState: 1;				//授权状态
		u8 LockState     : 1;				//枪锁定状态
		u8 Online        : 1;				//在线
	}Flag;
}GunState_TypeDef;
typedef struct
{
	u8                      VersionFindFlag;
	u8                      Version[10];
}GunVersion_Type;
typedef  union 
{
	u8 State;
	struct
	{
		u8 Update_Flag   : 1;				//升级标志
		u8 RightRun_Flag : 2;				//待运行标志
		u8 BaudRateSync_Flag  : 1;	//波特率同步标志
		u8 HaveBackups   : 1;       //有备份过    
		u8               : 1;				//
		u8               : 1;				//
		u8 DisableUpdate : 1;				//不允许更新
		}Flag;
}ROM_UpData_State_Type;
typedef struct
{
	u8   Number;//关联设备的设备号
	u8   Port;//端口
	u8   location;//内存位置
}AssociatedDevices_Type;
typedef struct
{
	u8                      Handshake;       //握手步骤进度
	u8                      DartSeq;         //dart协议通讯序号
	u8                      LYGunNeedCMD;    //下下个需要的命令
	u8                      LYGunState;      //龙野协议枪状态
	u8                      LYHandshakeCRC;     //龙野握手校验
	u8                      MB_CMD_Next;     //下个命令
	u8                      MB_CMD_Next_End;//指令不自动转换，主要是在停止生成记录和启动的过程。用在改单价之火读取单价和单独预置指令
	u8                      PresteType;      //
	u32                     PresetValue;     //
	timer_TypeDef           LTDelayTimer;    //蓝天协议下加油结束等待生成总累
	GunState_TypeDef        fuelState_B;     //上次枪状态
	u8                      SlaveNeedReply;   //回复wifi从机的状态，转接中心过来的枪状态的回复信息给从机
	FData_Type              FData;           //实时数据
	CTOTAL_Type             CTOTAL;          //累计
	u32                     Price;           //单价
	u8                      PriceStete;      //单价0=不生效;1=一次性生效;2=永久生效
	u32                     PulseCoefficient;//脉冲当量
	u16                     ValveValue;      //提前关阀量
	u16                     MinDisplay;      //最小显示值
	u8                      RSSI;             //LORA信号强度
	u8                      Call;             //请求授权
	u8                      WaitPREXDATA_flag;//等待记录形成，完成之前不能再次启动，防止形成记录之前再次授权
	u8                      CardNumber[10];
	u8                      RFIDUserName[15];
	u8                      CardPSWD[3];
	u8                      CarLicensePlate[15];
	u32                     Mileage;
	u8                      BalanceDecimal;
	u8                      Balance[5];
	u8                      RFIDState;
	AssociatedDevices_Type  AssociatedDevices;//没有对应RFID为0(关联设备信息)
	GunVersion_Type         GunVersion;
	u16                     FrameNow;
	ROM_UpData_State_Type   ROM_UpData_State;
	u8                      FatherNum;//父设备号
	u8                      SonNum;//子设备在父设备中的位置
	u8                      ParameterNumber;
	YGGunState_TypeDef      YGGunState;  //龙野协议枪状态
}GunInfo_Type;

typedef struct
{
	ROM_UpData_State_Type   ROM_UpData_State;
	u16                     FrameTop;
}ROM_UpData_Type;
typedef enum
{
	Control_POSAuto,
  Control_POSManual,
	Control_BoxAuto,
	Control_NoGun,
}GunControlState_Item;
typedef enum
{
	NowAuthorizeType_Online,
  NowAuthorizeType_Offline_NoCard,
	NowAuthorizeType_Offline_Card,
}NowAuthorizeType_Type;
typedef struct
{
	u8                      GunNummber;
	u8                      GunAddr;
	GunState_TypeDef        GunState;
	u32                     OrderNumber;
	u8                      RFIDBinding;//绑定的RFID编号
	ROM_UpData_State_Type   ROM_UpData_State;
	u8                      GunControlState;//授权模式
	u8                      NowAuthorizeType;//当前加油的授权方式0；在线；1离线非卡；2离线白名单
	u8                      Standby[3];
}GunData_Type;
typedef enum
{
	MD_RS485,
  MD_LORA,

}MDConnectType;
typedef union  
{
	u8 State;
	struct
	{
		u8 OilCNT   : 2; 
	  u8 MoneyCNT : 2;   
    u8 Price    : 2;    
	}Dec;
}GunDec_TypeDef;
typedef struct
{
	u8            Number;
	u8            Type[7];
}PaymentType_Type;
typedef struct
{
	u32                     BaudRate;
	u8                      StopBits;
	u8                      Parity_Even;
	u8                      POSType;      //协议类型
	u8                      DeviceNumber; //设备数量
	u32                     MBCountTime;  //轮询时间ms
	u8                      Device_Type;  //设备类型
	u8                      MDConnectType;//连接形式 485/LORA
	u8                      ROM_UpData_Version[10];
	ROM_UpData_Type         ROM_UpData;
	GunDec_TypeDef          GunDec;
	PaymentType_Type        PaymentType;
	u8                      Standby[10];
}PortData_Type;
typedef struct
{
	PortData_Type           PortData;
	GunData_Type            GunData[16];
}MD_Port_Data_Type;
typedef struct
{
	u8   SonNumber;//子设备数量
	u8   Address;//统一指令
	u8   SonStart;//第一个子设备的内存位置
	u8   SonNow;//当前要操作的枪
	u8   Handshake;//握手序号
	u8   MB_CMD_Next;
	u8   MB_CMD_Need;    //下下个需要的命令
	u8   Handshake_Top;//握手序号最大值
	u8   Password_Lever;
	u32  Password;   
	u8   LockType;
	u8   LockTime[3];//年月日
	u16  lockNummber;
	u8   LockValue[6];
	GunVersion_Type  Version;
	u16  FrameNow;
	u8   Mac[12];
	timer_TypeDef           LTDelayTimer;    //蓝天协议下加油结束等待生成总累，其他协议也可以用来判断是否行程记录的时间
}FatherDevice_Type;
typedef struct
{
	GunState_TypeDef        State;
	u8                      SingleOrDouble;//单双面0单1双
	u8                      PriceNumber;//面板数量
	u8                      Length;//单价长度2-6
	u8                      Brightness;//亮度0-8
	u32                     Price[12];//
	u8                      Decimal[12];//小数位
}PriceTagData_Type;
typedef struct
{
	u8                      pGunReturn;//插队之后返回
	u8                      pGunCapture;//插队的枪号
	u8                      pGunNow;//当前发送枪号
	u8                      PumpNow;//当前发送泵号
	u8                      LoopGunNextFlag;//允许继续发送下一枪
	u8                      Handshake_Top;//握手序号最大值
	u8                      FatherDeviceTop;//几个泵
	FatherDevice_Type       FatherDevice[16];//每个泵的信息
	GunInfo_Type            GunInfo[16];
	PriceTagData_Type       PriceTagData;
}MD_Port_Info_Type;

typedef struct
{
	u8                      DeviceNumber;
	PortData_Type           PortData[5];
	GunState_TypeDef        State[5];
	u8                      Standby[20];
}MD_Multiplex_Port_Data_Type;
typedef struct
{
	u8                      DevicerReturn;//插队之后返回
	u8                      DevicerCapture;//插队的枪号
	u8                      DevicerTypeNow;//当前发送的设备类型
	u8                      PrintPlaceNumber;//当前打印位置
	u8                      PrintType;//当前打印类型
	u8                      LoopDevicerNextFlag;//允许继续发送下一枪
	u8                      Handshake[5];//握手序号最大值
	u8                      MB_CMD_Next[5];
	u8                      Handshake_Top[5];//握手序号最大值
	timer_TypeDef           MultiplexDevicerTimer[5];
	u8                      MBCountCutNum[5];
	GunState_TypeDef        State[5];
	PriceTagData_Type       PriceTagData;
}MD_Multiplex_Port_Info_Type;


typedef struct
{
  char CMD_SOCKA[50];
	char IMEI[20];
	char APN[40];
	char WiFIName[40];
	char WiFIPassWord[20];
}WirelessData_Type;
typedef struct
{
	WirelessData_Type       WirelessData;
	union  
	{
		u16 State;
		struct
		{
			u8 ConnectMode   : 4;
			u8 NetworkSet    : 4;//如果是wifi从机模式，参数当WiFiHostSet用
		}Flag;
	}POSConnectTyye;
	u8                      Address;//从机自身的地址，目的是分时发送数据
	u8                      WhiteListVersion;
	u8                      Standby[19];
}POSData_Type;
typedef struct
{
	u8                      Link_Flag;
	u8                      ConnectType;
	u8                      NetType;
	u8                      POS_ConnectRXTask_Flag;
	u8                      POS_CMD_Next;
	u8                      WiFiSetState;
	u8                      WiFiRSSI;
	u8                      WiFiChannel;
	u8                      AskCongfig_Num;//上电申请配置下发，1-2端口
	u8                      HostHandshake;
	u8                      IP[50];
}POS_Info_Type;


typedef union  
{
	u16 State;
	struct
	{
    u8 POSNetSetErrNummber : 3;        //网络模块配置失败次数
		u8 POSNetCMDNext       : 4;        //指令模式下待发送指令
		u8 WorkMode            : 1;        //工作模式Bit6 0:指令 1:透传  
	}Flag;
}POSNetSetState_TypeDef;
typedef union  
{
	u16 State;
	struct
	{
    u8 ConnectSetErrNummber : 3;        //网络模块配置失败次数
		u8 SetModeCMDNext       : 4;        //指令模式下待发送指令
		u8 WorkMode             : 1;        //工作模式Bit6 0:指令 1:透传  
	}Flag;
}MDConnectState_TypeDef;
typedef union  
{
	u8 State;
	struct
	{

	  u8 APN          : 1;			  //配置文件包含APN
	}Flag;
}Sysconfig_Flag_TypeDef;
typedef struct
{
	u16                     WhiteListTop;
	u8                      CardNum[200][6];
}WhiteList_Type;
typedef struct
{
	u32                     PREXDATA_NowWaitUpNummber;//这次上传时记录数量备份
	u16                     PREXDATA_NowFrame;    //这次上传的帧
	u8                      PREXDATA_NowFrameLen;//这次上传的帧包含的条数
}PREXDATA_Upload_Type;
typedef union  
{
	u8 State;
	struct
	{
		u8 Power10V  : 1;
	  u8 Power7V   : 1;
	}Flag;
}PowerDown_TypeDef;
typedef union  
{
	u8 State;
	struct
	{
		u8  : 1;				//
		u8  : 1;	      //
		u8  : 1;				//
		u8  : 1;			  //
		u8  : 1;       //
		u8  : 1;				//
		u8  : 1;				//
		u8 Online        : 1;				//在线
	}Flag;
}CNGPLCState_TypeDef;
typedef  union
{
	u8 Buff[80]; //ModBus寄存器组
	__packed struct 
	{
		float                   PistonAValue;//A活塞当前值`
		float                   PistonBValue;//B活塞当前值
		float                   IntakePressure; //进气压力
		float                   LowPressure;    //低压压力
		float                   InstrumentAirPressure;//仪表风压力
		float                   MediumPressure;         //中压压力
		float                   GasConcentration1;//橇内燃气浓度1
		float                   HydraulicOilTemperature;//液压油温
		float                   HighPressure;           //高压压力
		float                   ProtectPressure;        //保护压力
		float                   WaterTemperature;       //水流温度
		float                   GasConcentration2;     //燃气浓度2
		float                   GasConcentration3;     //燃气浓度3
		u16                     MW28Alarm;              //MW28报警
		u16                     MB5Alarm;                //MB5报警
		u16                     MB10Alarm;              //MB10报警
		}REG;
}CNGPLCData_Type;
typedef  struct
{
	u16                     Encryption[4];
	ErrState_TypeDef        ErrState;
	u8                      BoardType;//靠按键状态识别是不是新版本的主板
	u8                      HardwareVersion;//硬件版本  ////24-31是大板，32-38是小板,小板没有第五端口
	u8                      WiFiSlaveMode;
	Sysconfig_Flag_TypeDef  Sysconfig_Flag;
	
	PowerDown_TypeDef       PowerDown;
	u8                      SystemErr;
	u16                     POS2MD_Buff_Len;
	u8                      USART6_Drive;
	u8                      SurfaceNow;
	u8                      SurfaceNowLine;
	u8                      SurfaceNowItem;
	u8                      SurfaceSelected_Flag;
	u8                      DisplayOn;
	u8                      KeyNum;
	timer_TypeDef           KeyFindTimer;
	u8                      POS_MonitorModel;//监控模式
	u8                      OfflineAuthorize;
	u16                     OfflineAuthorizeNumberMax;
	PREXDATA_Type           PREXDATA[5];
	u32                     PREXDATA_WaitUpNummber;//待上传数量
	PREXDATA_Upload_Type    PREXDATA_Upload;
	u32                     PREXDATA_TTC;
	PREXDATA_Type           PrintLastRecord[64];//越南打印每把枪最后一笔数据
	PREXDATA_Type           PrintRecord;//历史记录打印，后台下发数据
	PrintInfo_Type          PrintInfo;
	ROM_UpData_Type         ROM_UpData;
	u8                      ROM_UpData_ProgressBar;
	u8                      ROM_UpData_Port;
	LTGunState_TypeDef      LTGunState;  //蓝天协议枪状态
	//YGGunState_TypeDef      YGGunState;  //龙野协议枪状态
	DartGunState_TypeDef    DartGunState;//Dart协议枪状态
	HYState_TypeDef         HYState;  //弘扬协议状态
	HYSelfTestState_TypeDef HYSelfTestState;//弘扬协议状态
	u8                      FRam_Flag;
	u8                      ATDB45_Flag;
	u8                      ATDB45Type;
	u8                      Frame[513];
	u8                      UDisk_Flag;
	CTIME_type              CTIME;
	CTIME_type              PosCTIME;
	u32                     RNGData;
	float                   Apacity[100];
	u8                      TankNumTop;
	TankState_Type          TankState[5][12];
	TankData_Type           TankData[5][12];
	CNGPLCData_Type         CNGPLCData;
	CNGPLCState_TypeDef     CNGPLCState;
	
	WhiteList_Type          WhiteList;//白名单列表
	
	//MessageQueue_Type       POS_TX_MessageQueue;
	u8                      POS_TX_CMDNow;
	u8                      PCCountMail_Flag;
	u16                     PCMail_RX_Len;
	
	u8                      PosYWY_Pressure_Nummber;
	timer_TypeDef           CTIMEReadTimer;
	timer_TypeDef           HeartbeatTimer;
	timer_TypeDef           POS_RS232Timer;
	timer_TypeDef           ReSendDataTimer;
	//PCCount_RX_Buff_TypeDef PCCountMail;
	
	u8                      ConnectType;
	timer_TypeDef           DelayDetectionTimer;	//网络延迟检测定时器
	u32                     DelayDetection;//网络延迟数据，0表示收不到信息
	timer_TypeDef           POSCutTimer;	
	timer_TypeDef           MDRestartTimer[4];	     //
	u8                      POSLOCK_Impower;
	POSNetSetState_TypeDef  POSNetSetState;
	u8                      ICCID[21];
	POSData_Type            POSData;
	POS_Info_Type           POS_Info;
	timer_TypeDef           GPSDataTimer;
	GPS_Type                GPSData;
	
	u8                          Timer_Num_Top;
	volatile timer_TypeDef      *Timer_Buff[200];
	timer_TypeDef               AnalogTimer;
	MDConnectState_TypeDef      MDConnectState[5];
	u8                          MD_Port_Num_Top;
	u8                          MD_Gun_Num_Top;
	timer_TypeDef               MBCountRXIDLETimer[4];
	timer_TypeDef               MBCountTimer[4];
	u8                          MBCountCutNum[4][16];		                 //断线定时器
	MD_Multiplex_Port_Data_Type MD_Multiplex_Port_Data;//端口5，多路复用口
	MD_Multiplex_Port_Info_Type MD_Multiplex_Port_Info;
	timer_TypeDef               MD_MultiplexRXIDLETimer;
	timer_TypeDef               MD_MultiplexTimer;
	u16                         MD_Multiplex_Rec_Nummber;
	u16                         MD_Multiplex_Rec_NummberB;//临时判断接受长度
	MD_Port_Data_Type           MD_Port_Data[4];
	MD_Port_Info_Type           MD_Port_Info[4];
	u16                         MD_Rec_Nummber[4];
	u16                         MD_Rec_NummberB[4];//临时判断接受长度
	timer_TypeDef               MD_FramContinuityTimer[4];
	timer_TypeDef               POSReLinkTimer;
	
	timer_TypeDef           MD_LORA_SlaveTimer;
	u8                      MD_LORA_Slave_Flag;
	u8                      MD_LORA_Set_Flag;
}TXHData_type;

//******************************************************************************
extern volatile TXHData_type TXHData;//定义指针数据
extern const u8  BoxVersion[11];
extern cup_t STM32CPU;
void TXH_Init(void);
void TXH_Task(void);

//------------------------------------------------------------------------------

#endif
