#ifndef _PB_FUN_H_
#define _PB_FUN_H_

#include "apt32f102_gpio.h"
#include "pwm.h"

#define PB_SOFTBOOT_PERIOD      100     //PB软启动一个周期的时间

//PB输出控制使能
#define DRV_PB_ENABLE           GPIO_Write_High(GPIOA0,12)
#define DRV_PB_DISABLE          GPIO_Write_Low(GPIOA0,12)

#define DRV_PB36V_ON            GPIO_Write_High(GPIOB0,4)
#define DRV_PB36V_OFF           GPIO_Write_Low(GPIOB0,4)

#define DRV_PS36V_ON            GPIO_Write_High(GPIOA0,14)
#define DRV_PS36V_OFF           GPIO_Write_Low(GPIOA0,14)

//过流保护中断引脚
#define PB_OVERCURR_PWR_BUS     GPIO_Read_Status(GPIOB0,1)

//PowerBus 保护电流
#define PB_SaveCurrent_Min		1
#define PB_SaveCurrent_Max		165

/*PB通讯 RS485协议相关内容 - 开始*/
/*PB通讯 RS485协议 - 格式*/
typedef enum{
    PB_FMT_ADDR_TX = 0,
    PB_FMT_TYPE,
    PB_FMT_DEV_TYPE,
    PB_FMT_ADDR_RX,
    PB_FMT_LEN,
    PB_FMT_CKS,
    PB_FMT_CMD,
    PB_FMT_PARA,
}PB_FMT_E;

#define PB_DEV_Addr     	0x01    //PB设备地址默认0x01 主机地址默认为0x00
//#define PB_DEV_StripAddr	0x01	//PB灯带地址默认0x01
#define PB_DEV_TYPE     0x30      	//PB设备类型
#define PB_BUFFER_SIZE  100      	//PB缓冲区数据大小
#define PB_BUFFER_NUM   8      		//PB缓冲区数据个数
#define PB_INTP_BUFFER_SIZE		200	//PB中断发送 缓冲区数据大小

/*PB20 通讯协议命令*/
#define PB_CMD_GET_STATE           					0x20    //查询当前状态
#define PB_CMD_SET_STRIP_BRIGHTNESS     			0x21    //设定灯带亮度
#define PB_CMD_SET_STRIP_SWITCH						0x22	//设定灯带开关状态
#define PB_CMD_SET_STRIP_ADJUST						0x23	//设定灯带亮度递增、递减
#define PB_CMD_SET_PIRTIGGLE_LED					0x24	//设定LD PIR触发LED
#define PB_CMD_SET_CurrTiggleStrip					0x25	//PB总线电流触发灯带调光
#define PB_CMD_SET_SaveCurrInfo						0x26	//设定PB总线保护电流
#define PB_CMD_GET_SaveCurrInfo						0x27	//获取PB总线保护电流信息
#define PB_CMD_SET_UniversPara						0x28	//设定整体参数
#define PB_CMD_SET_PowerBus_Enable					0x29	//设定PB 总线输出使能
#define PB_CMD_PassThroug_Data						0x2A	//PB透传命令

#define PB_CMD_SET_PB_LEDS_BRIGHTNESS				0x30	//设定PB总线 LED亮度				--按照地址段控制	每个回路可单独设定亮度
#define PB_CMD_SET_PB_LEDS_ADJUST					0x31	//设定PB总线 LED亮度递增递减调节	--按照地址段控制
#define PB_CMD_SET_PB_LEDS_SWITCH					0x32	//设定PB总线 LED开关状态			--按照地址段控制
#define PB_CMD_SET_PB_LEDS_BRIGHT					0x33	//设定PB总线 LED亮度				--按照地址段控制
#define PB_CMD_SET_PB_LED_SWITCH					0x34	//设定PB总线 LED单开关状态			--按照单独回路控制
#define PB_CMD_SET_PB_LED_BRIGHTNESS				0x35	//设定PB总线 LED单回路亮度			--按照单独回路控制
#define PB_CMD_SET_PB_LED_Adjust					0x36	//设定PB总线 LED单回路亮度调节			--按照单独回路控制
#define PB_CMD_SET_PB_ALLLED_Switch					0x37	//设定PB总线 LED全部设备开关状态

#define PB_CMD_SET_PB_STRIPS_BRIGHTNESS				0x40	//设定PB总线 Strip亮度				--按照地址段控制	每个回路可单独设定亮度
#define PB_CMD_SET_PB_STRIPS_ADJUST					0x41	//设定PB总线 Strip亮度递增递减调节	--按照地址段控制
#define PB_CMD_SET_PB_STRIPS_SWITCH					0x42	//设定PB总线 Strip开关状态			--按照地址段控制
#define PB_CMD_SET_PB_ALLSTRIP_Switch				0x43	//设定PB总线 Strip全部设备开关状态
#define PB_CMD_SET_PB_STRIP_SWITCH					0x44	//设定PB总线 Strip单开关状态			--按照单独回路控制
#define PB_CMD_SET_PB_STRIP_BRIGHTNESS				0x45	//设定PB总线 Strip单回路亮度			--按照单独回路控制
#define PB_CMD_SET_PB_STRIP_Adjust					0x46	//设定PB总线 Strip单回路亮度			--按照单独回路控制
#define PB_CMD_SET_PB_STRIP_RELATIVE_GROUP_ADJUST	0x47	//设定PB总线 Strip相对调节	--按照32回路/组
#define PB_CMD_SET_PB_STRIP_RELATIVE_ADJUST 		0x48	//设定PB总线 Strip相对调节	--指定回路


#define PB_CMD_SET_PB_RELAYS_SWITCH					0x50	//设定PB总线 继电器开关状态				--按照地址段控制
#define PB_CMD_SET_PB_ALLRELAY_SWITCH				0x51	//设定PB总线 全部继电器开关状态			--按照地址段控制
#define PB_CMD_SET_PB_RELAY_SWITCH					0x52	//设定PB总线 继电器开关状态				
#define PB_CMD_SET_PB_RELAY_DELAY_SWITCH			0x53	//设定PB总线 继电器延时开关状态

#define PB_CMD_Reply_Succ							0x00	//PowerBus总线通讯空闲				
#define PB_CMD_Reply_CommStateBusy					0x01	//PowerBus总线通讯繁忙	
#define PB_CMD_Reply_ParaError						0x02	//参数错误

/*PB通讯 RS485协议相关内容 - 结束*/

/*PB 总线通讯协议 相关内容 - 开始*/

#define POWERBUS_SEND_DELAY     50      //PowerBus 发送延时 50ms

typedef enum
{
    PowerBUS_FMT_LEN,
    PowerBUS_FMT_SN,
    PowerBUS_FMT_CKS,
    PowerBUS_FMT_CMD,
    PowerBUS_FMT_PARAM,
}PowerBUS_FMT_e;


#define PowerBUS_CMD_SET_LED_BRIGHTNESS                 0x01        //设置亮度
#define PowerBUS_CMD_SET_LED_SWITCH                     0x02        //设置开关状态
#define PowerBUS_CMD_SET_LED_ADJUST                     0x03		//设定调光
#define PowerBUS_CMD_SET_LEDS_BRIGHTNESS				0x04		
#define PowerBUS_CMD_SET_LEDS_SWITCH					0x05
#define PowerBUS_CMD_SET_LEDS_ADJUST					0x06
#define PowerBUS_CMD_SET_LEDS_BRIGHT					0x07	
#define PowerBUS_CMD_SET_ALLLED_SWITCH					0x08
#define PowerBUS_CMD_SET_PIR_ENABLE						0x09 		//设定PIR使能

#define PowerBUS_CMD_SET_STRIP_BRIGHTNESS               0x11        //设置亮度		--指定回路
#define PowerBUS_CMD_SET_STRIP_SWITCH                   0x12        //设置开关状态	--指定回路
#define PowerBUS_CMD_SET_STRIP_ADJUST                   0x13		//设定调光		--指定回路
#define PowerBUS_CMD_SET_STRIPS_BRIGHTNESS				0x14		//设定亮度 		按照组地址控制
#define PowerBUS_CMD_SET_STRIPS_SWITCH					0x15		//设定开关状态	按照组地址控制
#define PowerBUS_CMD_SET_STRIPS_ADJUST					0x16		//设定调光		按照组地址控制
#define PowerBUS_CMD_SET_ALLSTRIP_SWITCH				0x17		//设置LED开关状态	--全部开关状态可单独设置
#define PowerBUS_CMD_SET_STRIP_RELATIVE_GROUP_ADJUST	0x18		//设置灯带相对调节	--按照32回路/组
#define PowerBUS_CMD_SET_STRIP_RELATIVE_ADJUST 			0x19		//设置灯带相对调节	--指定回路


#define PowerBUS_CMD_SET_RELAYS_SWITCH					0x21		//设定继电器开关状态 - 组地址控制
#define PowerBUS_CMD_SET_ALLRELAY_SWITCH				0x22		//设定继电器全部开关状态
#define PowerBUS_CMD_SET_RELAY_SWITCH                   0x23		//设定继电器开关状态
#define PowerBUS_CMD_SET_RELAY_DELAY_SWITCH				0x24		//设定继电器延时开关控制

#define PowerBUS_CMD_SET_UniversPara					0xF0		//设定整体参数信息 - 调光上下限设定，全局亮度设定

/*PB 总线通讯协议 相关内容 - 结束*/

#define PB_GROUP_NUM    	32
#define MEAS_BUFFER_SIZE	20
#define MEAS_Debounce_Num	5

#define MEAS_InputVoltage_Min	10000		//输入电压最低为10V,单位：mV
#define MEAS_InputVoltage_Max	38000		//输入电压最高为38V,单位：mV

typedef struct{
	//输入电源检测与输出电源开关 相关定义
	U8_T meas_cnt;						//检测BUFF 当前下标
	U8_T meas_fill_flag;				//检测BUFF 已满标志位
	U8_T meas_hv_PB_ONcnt;				//
	U8_T meas_hv_PS_ONcnt;				//
	U8_T meas_hv_PB_OFFcnt;				//
	U8_T meas_hv_PS_OFFcnt;				//
	U8_T meas_hv_PB_State;
	U8_T meas_hv_PS_State;
	U8_T last_meas_hv_PB_State;
	U8_T last_meas_hv_PS_State;
	U8_T meas_hv_curr_ward;				//PB负载电流检测 挡位 0x00:低挡位，0x01:高挡位
	U8_T meas_hv_curr_toggle;
	U8_T meas_hv_curr_cnt;				
	U8_T meas_hv_curr_filter;
			
	U8_T meas_load_current_ONcnt;			//PB负载电流 触发灯带计数
	U8_T meas_load_current_OFFcnt;			//PB负载电流 触发灯带计数
	U8_T meas_load_current_state;		//PB负载电流 触发状态
	
	//PB 状态变量相关定义
    U8_T power_status;                   //PB 开关状态
    U8_T enable;                         //PB 使能状态
    U8_T soft_boot;						 //PB 软启动
    U8_T protect_flag;                   //PB 电源保护标志位
    U8_T protect_curr;                   //PB 保护电流值

    U8_T recv_addr;                      //接收数据地址
    U8_T recv_sn;                        //接收SN号
    U8_T recv_cmd;                       //接收命令
    U8_T ackbuff[PB_BUFFER_SIZE];        //应答数据

    U8_T sendSN;
    U8_T sendCnt;
    U8_T sendReadCnt;
    U8_T sendWriteCnt;
    U8_T sendbufferlen[PB_BUFFER_NUM];
    U8_T sendbuffer[PB_BUFFER_NUM][PB_BUFFER_SIZE];

//    U8_T brightnessCurr[PB_GROUP_NUM][8];
//    U8_T switchState[PB_GROUP_NUM];

    U8_T resendNum;                      //下发PB数据 - 重发次数
	
    U16_T ackLen;                        //应答数据长度
    U16_T soft_boot_cnt;      		//软启动占空比
    U16_T soft_boot_high;     		//软启动 - 高电平时间
    U16_T soft_boot_low;      		//软启动 - 低电平时间
	U16_T meas_powerbus_volt;		//PB电压
	U16_T meas_powerstrip_volt;		//PS电压
	U16_T meas_powerbus_curr;		//PB电流
	
	U16_T meas_hv_PB_val[MEAS_BUFFER_SIZE];
	U16_T meas_hv_PS_val[MEAS_BUFFER_SIZE];
	U16_T meas_hv_CURRPWRx5_val;
	U16_T meas_hv_CURRPWRx50_val;
	U16_T meas_hv_CURRPWR_Buff[MEAS_Debounce_Num];
	//U16_T meas_hv_CURRPWR_FilterBuff[5];

    U32_T protect_time;       //PB 保护电流过载时间
    U32_T soft_boot_tick;     //软启动 时间戳
    U32_T protect_tick;       //电流过载 时间戳
    U32_T send_tick;          //发送时间戳
}PB_INFO_T;

/*PB 检测电流变化相关变量*/

#define Filter_Coarse_Size		5
#define Filter_Fine_Size		50

typedef struct{
	U8_T pb_state;					//状态 0x00:未触发；0x01:触发；0x02:释放
	U8_T last_pb_state;			
	U8_T dead_switch;				//功能失效开关 - RCU下发控制时，在一定时间内会失效
	
	U8_T fun_enable;				//功能使能状态
	U8_T strip_relation;			//灯带关联	
	
	U8_T triggle_strip_bright[PWM_OUT_CH_MAX];		//触发后灯带亮度
	U8_T release_strip_bright[PWM_OUT_CH_MAX];		//释放后灯带亮度
	
	U8_T trigger_debounce_cnt;		//触发消抖计数
	U8_T release_debounce_cnt;		//释放消抖计数
	U8_T trigger_debounce_num;		//触发消抖次数
	U8_T release_debounce_num;		//释放消抖次数
	
	U16_T strip_gradient_time;		//灯带渐变时间,单位：ms
	
	U16_T trigger_threshold;		//触发阈值 - 单位：mW
	U16_T release_threshold;		//释放阈值 - 单位：mW
	
	U16_T coarse_filter_buff[Filter_Coarse_Size+1];		
	U16_T fine_filter_buff[Filter_Fine_Size+1];

	U32_T dead_time;				//失效时间
	U32_T dead_tick;				//失效时间戳
	
	int	curr_diff_val;				//电流差值
	
}PB_DETECTION_FILTER_INFO;



extern PB_INFO_T g_PB;

void PB_Init(void);
void PB_Set_SaveCurrent(U8_T val);
U8_T PB_CheckSum(U8_T *buff,U16_T len);
void PB_Send_String_INT(void);
void PB_OVERCURR_PWR_BUS_INT_Processing(void);
void PB_Scan_State_Task(void);
U16_T Get_PB_CURR_VAL(void);
U8_T BLV_PB_Control_Protocol_Processing(U8_T *data,U16_T len);
void PowerBus_FillSendBuff(U8_T resendNum,U8_T *data,U8_T len);
U8_T PowerBUS_GetCommState(void);

void PB_Current_Monitoring_Meas(void);
void Set_PB_CurrMonitoring_Dead(void);

void PB_Task(void);

#endif
