Files
RCU_BUS485_PLC_MASTER/Source/SYSTEM/pb_fun.c

2197 lines
71 KiB
C
Raw Normal View History

#include "includes.h"
#include <string.h>
#include <stdlib.h>
#define PowerBus_SendData(data,len) UARTTransmit(UART0,data,len) //PowerBus总线控制 数据发送
#define RCU_PB_SendData(data,len) UARTTransmit(UART1,data,len) //RCU与PB通讯 数据发送
PB_INFO_T g_PB;
PB_DETECTION_FILTER_INFO curr_monitoring; //电流监视
void PB_Init(void){
memset(&g_PB,0,sizeof(PB_INFO_T));
memset(&curr_monitoring,0,sizeof(PB_DETECTION_FILTER_INFO));
//PB 功能
g_PB.enable = g_eeprom.powerbus_enable;
g_PB.protect_curr = g_eeprom.save_curr;
g_PB.protect_time = 5000; //5S
PB_Set_SaveCurrent(g_PB.protect_curr); //设置保护电流
}
/*********************************************************************
* @fn PB_Set_SaveCurrent
* @brief PB - PB
* @para val:1~165
*/
void PB_Set_SaveCurrent(U8_T val){
U32_T curr_val = 0;
if( (val < PB_SaveCurrent_Min) || (val > PB_SaveCurrent_Max) ) return ;
curr_val = val*4095/PB_SaveCurrent_Max;
BT_Period_CMP_Write(BT0,4095,curr_val);
}
/*********************************************************************
* @fn PB_Set_Power_State
* @brief PB - PB电源状态
*/
void PB_Set_Power_State(U8_T state){
switch(state){
case TRUE:
g_PB.enable = TRUE;
break;
case FALSE:
g_PB.enable = FALSE;
g_PB.power_status = FALSE;
DRV_PB_DISABLE;
break;
}
}
/*********************************************************************
* @fn PB_Soft_Boot_Task
* @brief PB -
*/
void PB_Soft_Boot_Task(void){
if(g_PB.meas_hv_PB_State != 0x01) return; //PB输出电源未打开
if(g_PB.enable != TRUE) return ;
switch(g_PB.soft_boot){
case 0x00: //开启启动
g_PB.soft_boot_high = 0x01;
g_PB.soft_boot_low = PB_SOFTBOOT_PERIOD - g_PB.soft_boot_high;
g_PB.soft_boot_tick = SysTick_100us;
g_PB.soft_boot_cnt = 0;
DRV_PB_DISABLE;
g_PB.soft_boot = 0x01;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_Soft_Boot_Task Start");
break;
case 0x01: //软启动中 - 低电平输出时间
if(SysTick_100us - g_PB.soft_boot_tick >= g_PB.soft_boot_low){
g_PB.soft_boot_tick = SysTick_100us;
DRV_PB_ENABLE;
g_PB.soft_boot = 0x02;
//Dbg_Println(DBG_BIT_SYS_STATUS, "PWM DutyLow %d",g_PB.soft_boot_low);
}
break;
case 0x02: //软启动中 - 高电平输出时间
if(SysTick_100us - g_PB.soft_boot_tick >= g_PB.soft_boot_high){
g_PB.soft_boot_tick = SysTick_100us;
g_PB.soft_boot_cnt++;
if(g_PB.soft_boot_cnt >= 3){
g_PB.soft_boot_cnt = 0;
g_PB.soft_boot_high++;
g_PB.soft_boot_low = PB_SOFTBOOT_PERIOD - g_PB.soft_boot_high;
}
if(g_PB.soft_boot_high >= PB_SOFTBOOT_PERIOD){
DRV_PB_ENABLE;
g_PB.enable = FALSE;
g_PB.power_status = TRUE;
g_PB.soft_boot = 0x00;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_Soft_Boot_Task End");
}else {
DRV_PB_DISABLE;
g_PB.soft_boot = 0x01;
}
//Dbg_Println(DBG_BIT_SYS_STATUS, "PWM DutyHigh %d",g_PB.soft_boot_high);
}
break;
}
}
/*PB 编码对照表*/
const U8_T PowerBus_Code_Comparative[16] = {0xEF,0xEE,0xED,0xB7,0xEB,0x77,0xD7,0x7D,0xE7,0xBB,0x7B,0xDB,0xBD,0xDD,0xDE,0xFF};
/*********************************************************************
* @fn PB_Data_Send
* @brief PB -
* @return 0x00:0x01:
*/
U8_T PowerBus_Data_Encoding(U8_T *CodeData,U8_T *Sourdata,U16_T SourLen){
U8_T temp_num = 0;
U8_T i=0;
for(i=0;i<SourLen;i++){
temp_num = (Sourdata[i] >> 4) & 0x0F;
CodeData[i*2] = PowerBus_Code_Comparative[temp_num];
temp_num = (Sourdata[i]) & 0x0F;
CodeData[i*2 + 1] = PowerBus_Code_Comparative[temp_num];
}
//Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Encoding Buff:", CodeData, SourLen*2);
return 0x00;
}
U8_T Uart_Intp_Send_Buff[PB_INTP_BUFFER_SIZE]; //中断发送buff
volatile U8_T UTS_send_Complete = 0;
volatile U8_T UTS_send_Length_temp = 0;
volatile U8_T UTS_send_Length = 0;
//中断发送 - 串口中断调用
void PB_Send_String_INT(void){
if(UTS_send_Complete != 0x00){
if(UTS_send_Length_temp >= UTS_send_Length){
UTS_send_Complete = 0;
UTS_send_Length_temp = 0;
}else{
if(UTS_send_Length_temp >= PB_INTP_BUFFER_SIZE){
UTS_send_Complete = 0;
UTS_send_Length_temp = 0;
}else{
//UARTTxByte(UART0,Uart_Intp_Send_Buff[UTS_send_Length_temp++]);
CSP_UART_SET_DATA(UART0,Uart_Intp_Send_Buff[UTS_send_Length_temp++]);
g_PB.send_tick = SysTick_1ms; //更新发送时间戳
}
}
}
}
/*********************************************************************
* @fn PowerBus_Data_Send
* @brief PowerBus - 线
* @return 0x00:0x01:
*/
U8_T PowerBus_Data_Send(U8_T *data,U16_T len){
U8_T send_buff[500];
memset(send_buff,0,sizeof(send_buff));
U16_T send_len = len;
if(send_len >= PB_BUFFER_SIZE) send_len = PB_BUFFER_SIZE;
//if(g_PB.power_status == 0x01)
{
// Dbg_Println(DBG_BIT_SYS_STATUS, "PB_Data_Send %d",len);
// Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "PB_Data_Send Buff:", data, len);
/*PowerBus - 总线通讯采用新编码格式*/
// PowerBus_Data_Encoding(send_buff,data,len);
// PowerBus_SendData(send_buff,len*2);
/*PowerBus - 总线通讯 中断发送*/
if(UTS_send_Complete == 0x00){
memset((void *)Uart_Intp_Send_Buff,0,sizeof(PB_INTP_BUFFER_SIZE));
PowerBus_Data_Encoding(Uart_Intp_Send_Buff,data,send_len);
UTS_send_Complete = 0x01;
UTS_send_Length = send_len*2;
UTS_send_Length_temp = 0x01;
UARTTxByte(UART0,Uart_Intp_Send_Buff[0]);
g_PB.send_tick = SysTick_1ms; //更新发送时间戳
}else{
//上次发送还未结束
return 0xFF;
}
return 0x00;
}
return 0x01;
}
/*********************************************************************
* @fn PB_CheckSum
* @brief PB -
* @return 0x00:0x01:
*/
U8_T PB_CheckSum(U8_T *buff,U16_T len){
U8_T sum = 0;
for(U16_T i=0;i<len;i++){
sum+=buff[i];
}
return ~(sum);
}
/*********************************************************************
* @fn PB_OVERCURR_PWR_BUS_INT_Processing
* @brief PB -
* @return NULL
*/
void PB_OVERCURR_PWR_BUS_INT_Processing(void){
//if(PB_OVERCURR_PWR_BUS == 0x01){
/*检测OverCurr引脚状态 上升沿中断信号 High:过流保护中Low:正常工作中*/
PB_Set_Power_State(FALSE);
g_PB.protect_flag = TRUE;
g_PB.protect_tick = SysTick_1ms;
//}
}
/*********************************************************************
* @fn PB_Protect_Task
* @brief PB - PB保护任务
*/
void PB_Protect_Task(void){
if(g_PB.protect_flag == TRUE){
Dbg_Println(DBG_BIT_SYS_STATUS, "PB Protect ....");
if(PB_OVERCURR_PWR_BUS == 0x00){
if(SysTick_1ms - g_PB.protect_tick >= g_PB.protect_time){
g_PB.protect_flag = FALSE;
PB_Set_Power_State(TRUE);
//Dbg_Println(DBG_BIT_SYS_STATUS, "重新开启PB电源");
}
}
}
}
/*********************************************************************
* @fn PB_Scan_State_Task
* @brief PB - - 1ms一次
*/
void PB_Scan_State_Task(void){
/*检测OverCurr引脚状态High:过流保护中Low:正常工作中*/
if(PB_OVERCURR_PWR_BUS == 0x01){
PB_Set_Power_State(FALSE);
g_PB.protect_flag = TRUE;
g_PB.protect_tick = SysTick_1ms;
//Dbg_Println(DBG_BIT_SYS_STATUS, "检测到 OverCurr High状态");
}
}
/*********************************************************************
* @fn PowerBus_FillSendBuff
* @brief PowerBus -
* @return NULL
*/
void PowerBus_FillSendBuff(U8_T resendNum,U8_T *data,U8_T len){
if(len >= PB_BUFFER_SIZE) len = PB_BUFFER_SIZE;
g_PB.resendNum = resendNum;
g_PB.sendbufferlen[g_PB.sendWriteCnt] = len;
memcpy(g_PB.sendbuffer[g_PB.sendWriteCnt], data, len);
g_PB.sendWriteCnt++;
if(g_PB.sendWriteCnt >= PB_BUFFER_NUM){
g_PB.sendWriteCnt = 0;
}
}
/*********************************************************************
* @fn PowerBus_PackFillBuff
* @brief PowerBus -
* @return NULL
*/
void PowerBus_PackFillBuff(U8_T resendNum,U8_T cmd,U8_T *data,U8_T len){
g_PB.sendSN++;
if(g_PB.sendSN >= 0xFA) g_PB.sendSN = 0x01; //SN号范围 1~250
g_PB.resendNum = resendNum;
if((len + PowerBUS_FMT_PARAM) >= PB_BUFFER_SIZE) len = PB_BUFFER_SIZE - PowerBUS_FMT_PARAM; //参数加上包头长度大于上限
g_PB.sendbufferlen[g_PB.sendWriteCnt] = len + PowerBUS_FMT_PARAM;
g_PB.sendbuffer[g_PB.sendWriteCnt][PowerBUS_FMT_LEN] = g_PB.sendbufferlen[g_PB.sendWriteCnt];
g_PB.sendbuffer[g_PB.sendWriteCnt][PowerBUS_FMT_SN] = g_PB.sendSN;
g_PB.sendbuffer[g_PB.sendWriteCnt][PowerBUS_FMT_CKS] = 0x00;
g_PB.sendbuffer[g_PB.sendWriteCnt][PowerBUS_FMT_CMD] = cmd;
memcpy(&g_PB.sendbuffer[g_PB.sendWriteCnt][PowerBUS_FMT_PARAM], data, len);
g_PB.sendbuffer[g_PB.sendWriteCnt][PowerBUS_FMT_CKS] = PB_CheckSum(&g_PB.sendbuffer[g_PB.sendWriteCnt][PowerBUS_FMT_LEN], g_PB.sendbufferlen[g_PB.sendWriteCnt]);
// Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Data Buff:", data, len);
// Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Send Buff:", g_PB.sendbuffer[g_PB.sendWriteCnt], g_PB.sendbufferlen[g_PB.sendWriteCnt]);
g_PB.sendWriteCnt++;
if(g_PB.sendWriteCnt >= PB_BUFFER_NUM){
g_PB.sendWriteCnt = 0;
}
}
/*********************************************************************
* @fn PowerBus_SendBuffer_Task
* @brief BLV PowerBus通讯协议发送任务
* @return none
*/
void PowerBus_SendBuffer_Task(void){
U8_T send_rev = 0;
if(g_PB.sendWriteCnt != g_PB.sendReadCnt){
if(SysTick_1ms - g_PB.send_tick >= POWERBUS_SEND_DELAY){
if(g_PB.sendCnt < g_PB.resendNum){
//Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "PowerBus_Data_Send",g_PB.sendbuffer[g_PB.sendReadCnt],g_PB.sendbufferlen[g_PB.sendReadCnt]);
send_rev = PowerBus_Data_Send(g_PB.sendbuffer[g_PB.sendReadCnt], g_PB.sendbufferlen[g_PB.sendReadCnt]);
if(send_rev != 0xFF){
Set_PB_CurrMonitoring_Dead();
g_PB.sendCnt++;
}
}else {
g_PB.sendCnt = 0;
g_PB.sendReadCnt++;
if(g_PB.sendReadCnt >= PB_BUFFER_NUM){
g_PB.sendReadCnt = 0;
}
return ; //直接退出不更新时间
}
//g_PB.send_tick = SysTick_1ms;
}
}
}
/*********************************************************************
* @fn PowerBUS_GetCommState
* @brief BLV PowerBus PowerBUS总线发送状态
* @return none
*/
U8_T PowerBUS_GetCommState(void){
if(g_PB.sendWriteCnt != g_PB.sendReadCnt){
return 0x01;
}
return 0x00;
}
/*********************************************************************
* @fn PB_FilACkPacket
* @brief BLV PB控制协议 -
* @return none
*/
void PB_FilACkPacket(U8_T *ackBuff,U8_T ackLen){
ackBuff[PB_FMT_ADDR_TX] = PB_DEV_Addr;
ackBuff[PB_FMT_TYPE] = (g_PB.recv_sn & 0x0F);
ackBuff[PB_FMT_DEV_TYPE] = PB_DEV_TYPE;
ackBuff[PB_FMT_ADDR_RX] = g_PB.recv_addr;
ackBuff[PB_FMT_LEN] = ackLen;
ackBuff[PB_FMT_CKS] = 0x00;
ackBuff[PB_FMT_CMD] = g_PB.recv_cmd;
ackBuff[PB_FMT_CKS] = PB_CheckSum(ackBuff, ackLen);
}
/*********************************************************************
* @fn PB_RS485_ReplyAck
* @brief BLV PB控制协议 -
* @return none
*/
void PB_RS485_ReplyAck(void){
g_PB.ackLen += PB_FMT_PARA;
PB_FilACkPacket(g_PB.ackbuff,g_PB.ackLen);
RCU_PB_SendData(g_PB.ackbuff,g_PB.ackLen);
g_PB.ackLen = 0;
}
/*********************************************************************
* @fn PB_Set_CH_SaveBrightnessInfo
* @brief PB -
* @return 0x00:
*/
U8_T PB_Set_CH_SaveBrightnessInfo(U8_T loop,U8_T brightness,U16_T gradualtime){
switch(loop){
case PWM_OUT_CH1:
g_eeprom.brightness[PWM_OUT_CH1] = brightness;
g_eeprom.gradialTime[PWM_OUT_CH1] = gradualtime;
break;
case PWM_OUT_CH2:
g_eeprom.brightness[PWM_OUT_CH2] = brightness;
g_eeprom.gradialTime[PWM_OUT_CH2] = gradualtime;
break;
case PWM_OUT_CH3:
g_eeprom.brightness[PWM_OUT_CH3] = brightness;
g_eeprom.gradialTime[PWM_OUT_CH3] = gradualtime;
break;
case PWM_OUT_CH4:
g_eeprom.brightness[PWM_OUT_CH4] = brightness;
g_eeprom.gradialTime[PWM_OUT_CH4] = gradualtime;
break;
default:
return 0x01;
break;
}
return 0x00;
}
/*********************************************************************
* @fn PB_Set_CH_SaveSwitchInfo
* @brief PB -
* @return 0x00:
*/
U8_T PB_Set_CH_SaveSwitchInfo(U8_T loop,U8_T switch_state){
switch(loop){
case PWM_OUT_CH1:
g_eeprom.swithcState[PWM_OUT_CH1] = switch_state;
break;
case PWM_OUT_CH2:
g_eeprom.swithcState[PWM_OUT_CH2] = switch_state;
break;
case PWM_OUT_CH3:
g_eeprom.swithcState[PWM_OUT_CH3] = switch_state;
break;
case PWM_OUT_CH4:
g_eeprom.swithcState[PWM_OUT_CH4] = switch_state;
break;
default:
return 0x01;
break;
}
return 0x00;
}
/*********************************************************************
* @fn PB_ACK_GET_STATE
* @brief BLV PB控制协议 - PB状态0x00
* @return none
*/
void PB_ACK_GET_STATE(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T i=0;
U16_T temp_val = Get_PB_CURR_VAL();
U32_T temp_power = 0;
//g_PB.recv_cmd = para[PB_FMT_CMD];
ackPara[i++] = g_pwm.allBrightness; //全局亮度
ackPara[i++] = g_pwm.allBrightnessUpLimit; //全局亮度可调上限
ackPara[i++] = g_pwm.allBrightnessDownLimit; //全局亮度可调下限
ackPara[i++] = g_pwm.brightnessCurr[PWM_OUT_CH1]; //灯亮度 - CH4
ackPara[i++] = g_pwm.brightnessCurr[PWM_OUT_CH2]; //灯亮度 - CH3
ackPara[i++] = g_pwm.brightnessCurr[PWM_OUT_CH3]; //灯亮度 - CH2
ackPara[i++] = g_pwm.brightnessCurr[PWM_OUT_CH4]; //灯亮度 - CH1
ackPara[i++] = (g_PB.meas_powerstrip_volt >> 8) & 0xFF; //当前灯带电压 H
ackPara[i++] = (g_PB.meas_powerstrip_volt) & 0xFF;; //当前灯带电压 L
ackPara[i++] = 0x00; //当前灯带CH1 电流 H
ackPara[i++] = 0x00; //当前灯带CH1 电流 L
ackPara[i++] = 0x00; //当前灯带CH2 电流 H
ackPara[i++] = 0x00; //当前灯带CH2 电流 L
ackPara[i++] = 0x00; //当前灯带CH3 电流 H
ackPara[i++] = 0x00; //当前灯带CH3 电流 L
ackPara[i++] = 0x00; //当前灯带CH4 电流 H
ackPara[i++] = 0x00; //当前灯带CH4 电流 L
ackPara[i++] = 0x00; //g_PB.switchState[group]; //Bit7~Bit4:灯带开关状态MASK ,Bit3~Bit0:灯带故障状态
ackPara[i++] = (g_PB.meas_powerbus_volt >> 8) & 0xFF; //当前PB BUS电压 H
ackPara[i++] = (g_PB.meas_powerbus_volt) & 0xFF; //当前PB BUS电压 L
ackPara[i++] = (temp_val >> 8) & 0xFF; //当前PB BUS电流 H
ackPara[i++] = (temp_val) & 0xFF; //当前PB BUS电流 L
temp_power = temp_val * g_PB.meas_powerbus_volt / 1000;
ackPara[i++] = (temp_power >> 24) & 0xFF; //当前PB BUS功率 H
ackPara[i++] = (temp_power >> 16) & 0xFF; //当前PB BUS功率 L
ackPara[i++] = (temp_power >> 8) & 0xFF; //当前PB BUS功率 H
ackPara[i++] = temp_power & 0xFF; //当前PB BUS功率 L
ackPara[i++] = g_PB.protect_flag; //PB BUS故障状态MASK
ackPara[i++] = g_PB.enable; //PB 输出使能状态
ackPara[i++] = Project_Software_Ver; //PB 软件版本
ackPara[i++] = Project_Hardware_Ver; //PB 硬件版本
ackPara[i++] = PowerBUS_GetCommState(); //PowerBus 当前通讯状态
Dbg_Println(DBG_BIT_SYS_STATUS, "PS Voltage:%dmV",g_PB.meas_powerstrip_volt);
Dbg_Println(DBG_BIT_SYS_STATUS, "PB CURR:%dmA Voltage:%dmV %dmW",temp_val,g_PB.meas_powerbus_volt,temp_power);
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "ACK Buff:", ackPara, i);
*ackLen = i;
}
/*********************************************************************
* @fn PB_ACK_SET_LED_BRIGHTNESS
* @brief BLV PB控制协议 -
* @return none
*/
void PB_ACK_SET_LED_BRIGHTNESS(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T chnMask = para[PB_FMT_PARA];
U8_T i = 0,save_flag = 0;
U16_T temp_val = 0x00;
//修改后的协议控制内容
for(i=0;i<PWM_OUT_CH_MAX;i++){
if((chnMask & (0x01 << i)) != 0x00){
temp_val = para[PB_FMT_PARA+6+i]*100;
PWM_SetCHGradualTime(i, temp_val);
PWM_SetOutBrightness(i, para[PB_FMT_PARA+2+i]);
Dbg_Println(DBG_BIT_SYS_STATUS,"Set PWM%d - %d %d",i,para[PB_FMT_PARA+2+i],para[PB_FMT_PARA+6]);
//是否保存参数
if( para[PB_FMT_PARA+1] == 0xF1){
PB_Set_CH_SaveBrightnessInfo(i,para[PB_FMT_PARA+2+i],temp_val);
save_flag = 0x01;
}
}
}
//目前展会使用的控制内容,旧协议内容
// for(i=0;i<PWM_OUT_CH_MAX;i++){
// if((chnMask & (0x01 << i)) != 0x00){
//
// PWM_SetCHGradualTime(i, temp_val);
// PWM_SetOutBrightness(i, para[PB_FMT_PARA+3+i]);
//
// Dbg_Println(DBG_BIT_SYS_STATUS,"Set PWM%d - %d %d",i,para[PB_FMT_PARA+3+i],temp_val);
// }
// }
if(save_flag == 0x01){
EEPROM_WriteParaInfo(&g_eeprom); //保存参数
}
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}
void PB_ACK_SET_STRIP_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T chnMask = para[PB_FMT_PARA];
U8_T i = 0,save_flag = 0;;
for(i=0;i<PWM_OUT_CH_MAX;i++){
if((chnMask & (0x01 << i)) != 0x00){
Pwm_SetOnOffState(i, para[PB_FMT_PARA+2+i]);
Dbg_Println(DBG_BIT_SYS_STATUS,"Set PWM%d - %d ",i,para[PB_FMT_PARA+2+i]);
//是否保存参数
if( para[PB_FMT_PARA+1] == 0xF1){
PB_Set_CH_SaveSwitchInfo(i,para[PB_FMT_PARA+2+i]);
save_flag = 0x01;
}
}
}
if(save_flag == 0x01){
EEPROM_WriteParaInfo(&g_eeprom); //保存参数
}
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}
void PB_ACK_SET_STRIP_ADJUST(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T chnMask = para[PB_FMT_PARA];
U8_T i = 0;
U16_T temp_val = 0;
for(i=0;i<PWM_OUT_CH_MAX;i++){
if((chnMask & (0x01 << i)) != 0x00){
temp_val = para[PB_FMT_PARA+3+i*3];
temp_val = temp_val * 100;
PWM_SetAutoAdjust(i, para[PB_FMT_PARA+1+i*3],para[PB_FMT_PARA+2+i*3],temp_val);
Dbg_Println(DBG_BIT_SYS_STATUS,"Set PWM%d - %d %d %dms",i,para[PB_FMT_PARA+1+i*3],para[PB_FMT_PARA+2+i*3],temp_val);
}
}
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}
/*********************************************************************
* @fn PB_ACK_SET_PIRTIGGLE_LED
* @brief BLV PB控制协议 - PB总线 LD PIR触发LED
* @return none
*/
void PB_ACK_SET_PIRTIGGLE_LED(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_PIR_ENABLE,&para[PB_FMT_PARA + 1],para_len);
}
/*********************************************************************
* @fn PB_ACK_SET_CurrTiggleStrip
* @brief BLV PB控制协议 - PB总线 PB总线电流触发灯带调光
* @return none
*/
void PB_ACK_SET_CurrTiggleStrip(U8_T *para,U8_T *ackPara,U16_T *ackLen){
//测试PB电流触发灯带调光
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA;
U16_T temp_para = 0;
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
if(para_len < 15) return ;
if((curr_monitoring.fun_enable == 0x00) && (para[PB_FMT_PARA] == 0x01)){
//之前是关的,现在开启;需要先稳定,在开始判断
Set_PB_CurrMonitoring_Dead();
}
curr_monitoring.fun_enable = para[PB_FMT_PARA]; //使能状态
temp_para = para[PB_FMT_PARA + 1];
temp_para = temp_para * 10 * g_PB.meas_powerbus_volt / 1000;
curr_monitoring.trigger_threshold = temp_para; //触发阈值
curr_monitoring.trigger_debounce_num = para[PB_FMT_PARA + 2]; //触发消抖次数
temp_para = para[PB_FMT_PARA + 3];
temp_para = temp_para * 10 * g_PB.meas_powerbus_volt / 1000;
curr_monitoring.release_threshold = temp_para; //释放阈值
curr_monitoring.release_debounce_num = para[PB_FMT_PARA + 4]; //释放消抖次数
curr_monitoring.strip_relation = para[PB_FMT_PARA + 5];
curr_monitoring.strip_gradient_time = para[PB_FMT_PARA + 6];
curr_monitoring.strip_gradient_time = curr_monitoring.strip_gradient_time * 100;
curr_monitoring.triggle_strip_bright[PWM_OUT_CH1] = para[PB_FMT_PARA + 7];
curr_monitoring.triggle_strip_bright[PWM_OUT_CH2] = para[PB_FMT_PARA + 8];
curr_monitoring.triggle_strip_bright[PWM_OUT_CH3] = para[PB_FMT_PARA + 9];
curr_monitoring.triggle_strip_bright[PWM_OUT_CH4] = para[PB_FMT_PARA + 10];
curr_monitoring.release_strip_bright[PWM_OUT_CH1] = para[PB_FMT_PARA + 11];
curr_monitoring.release_strip_bright[PWM_OUT_CH2] = para[PB_FMT_PARA + 12];
curr_monitoring.release_strip_bright[PWM_OUT_CH3] = para[PB_FMT_PARA + 13];
curr_monitoring.release_strip_bright[PWM_OUT_CH4] = para[PB_FMT_PARA + 14];
Dbg_Println(DBG_BIT_SYS_STATUS,"fun_enable %d",curr_monitoring.fun_enable);
Dbg_Println(DBG_BIT_SYS_STATUS,"trigger_threshold %dmW",curr_monitoring.trigger_threshold);
Dbg_Println(DBG_BIT_SYS_STATUS,"trigger_debounce_num %d",curr_monitoring.trigger_debounce_num);
Dbg_Println(DBG_BIT_SYS_STATUS,"release_threshold %dmW",curr_monitoring.release_threshold);
Dbg_Println(DBG_BIT_SYS_STATUS,"release_debounce_num %d",curr_monitoring.release_debounce_num);
Dbg_Println(DBG_BIT_SYS_STATUS,"strip_relation %d",curr_monitoring.strip_relation);
Dbg_Println(DBG_BIT_SYS_STATUS,"strip_gradient_time %d",curr_monitoring.strip_gradient_time);
Dbg_Println(DBG_BIT_SYS_STATUS,"triggle_strip_bright CH1 %d",curr_monitoring.triggle_strip_bright[PWM_OUT_CH1]);
Dbg_Println(DBG_BIT_SYS_STATUS,"triggle_strip_bright CH2 %d",curr_monitoring.triggle_strip_bright[PWM_OUT_CH2]);
Dbg_Println(DBG_BIT_SYS_STATUS,"triggle_strip_bright CH3 %d",curr_monitoring.triggle_strip_bright[PWM_OUT_CH3]);
Dbg_Println(DBG_BIT_SYS_STATUS,"triggle_strip_bright CH4 %d",curr_monitoring.triggle_strip_bright[PWM_OUT_CH4]);
Dbg_Println(DBG_BIT_SYS_STATUS,"release_strip_bright CH1 %d",curr_monitoring.release_strip_bright[PWM_OUT_CH1]);
Dbg_Println(DBG_BIT_SYS_STATUS,"release_strip_bright CH2 %d",curr_monitoring.release_strip_bright[PWM_OUT_CH2]);
Dbg_Println(DBG_BIT_SYS_STATUS,"release_strip_bright CH3 %d",curr_monitoring.release_strip_bright[PWM_OUT_CH3]);
Dbg_Println(DBG_BIT_SYS_STATUS,"release_strip_bright CH4 %d",curr_monitoring.release_strip_bright[PWM_OUT_CH4]);
}
/*********************************************************************
* @fn PB_ACK_SET_SaveCurrInfo
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_SaveCurrInfo(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA;
//*ackLen = 0;
if(para_len < 0x02) return ;
g_PB.protect_curr = para[PB_FMT_PARA];
Dbg_Println(DBG_BIT_SYS_STATUS,"protect_curr %d",g_PB.protect_curr);
/*不在范围内设置为默认值10A*/
if((g_PB.protect_curr < PB_SaveCurrent_Min) || (g_PB.protect_curr > PB_SaveCurrent_Max)){
g_PB.protect_curr = EEPROM_ParaDefault_SaveCurr;
ackPara[0] = 0x01; //设置失败
}else{
ackPara[0] = 0x00; //设置成功
}
PB_Set_SaveCurrent(g_PB.protect_curr);
if(para[PB_FMT_PARA + 1] == 0xF1){
if(g_eeprom.save_curr != g_PB.protect_curr){
g_eeprom.save_curr = g_PB.protect_curr;
EEPROM_WriteParaInfo(&g_eeprom); //保存参数
}
}
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}
/*********************************************************************
* @fn PB_ACK_GET_SaveCurrInfo
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_GET_SaveCurrInfo(U8_T *para,U8_T *ackPara,U16_T *ackLen){
*ackLen = 1;
ackPara[0] = g_PB.protect_curr;
}
/*********************************************************************
* @fn PB_ACK_SET_UniversPara
* @brief BLV PB控制协议 - PB整体亮度和PowerBus 线
* @return none
*/
void PB_ACK_SET_UniversPara(U8_T *para,U8_T *ackPara,U16_T *ackLen){
S8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
U8_T mask_bit = 0,rev = 0;
U32_T temp_val = 0;
if( para_len < 5 ) return ;
mask_bit = para[PB_FMT_PARA + 1];
if((mask_bit & 0x80) != 0x00){
//设定全局亮度
if( para[PB_FMT_PARA + 3] <= 100){
g_eeprom.allBrightness = para[PB_FMT_PARA + 3]; //全局亮度
Pwm_SetAllBrightness(g_eeprom.allBrightness);
}else{
rev = 0x01; //参数错误
}
Dbg_Println(DBG_BIT_SYS_STATUS,"Set allBrightness:%d",g_pwm.allBrightness);
}
if((mask_bit & 0x40) != 0x00){
//设定全局可调上限
if( para[PB_FMT_PARA + 4] <= 100){
g_eeprom.allBrightnessUpLimit = para[PB_FMT_PARA + 4]; //全局亮度可调上限
PWM_SetUpLimitVal(g_eeprom.allBrightnessUpLimit);
}else{
rev = 0x01; //参数错误
}
Dbg_Println(DBG_BIT_SYS_STATUS,"Set allBrightnessUpLimit:%d - %d",g_pwm.allBrightnessUpLimit,g_pwm.allPwmUpLimit);
}
if((mask_bit & 0x20) != 0x00){
//设定全局可调下限
if( (para[PB_FMT_PARA + 5] <= 100) && (para[PB_FMT_PARA + 5] < g_pwm.allBrightnessUpLimit) ){
g_eeprom.allBrightnessDownLimit = para[PB_FMT_PARA + 5]; //全局亮度可调上限
PWM_SetDownLimitVal(g_eeprom.allBrightnessDownLimit);
}else{
rev = 0x01; //参数错误
}
Dbg_Println(DBG_BIT_SYS_STATUS,"Set allBrightnessDownLimit:%d - %d",g_pwm.allBrightnessDownLimit,g_pwm.allPwmDownLimit);
}
if(para[PB_FMT_PARA + 2] == 0xF1){
/*保存参数*/
EEPROM_WriteParaInfo(&g_eeprom); //保存参数
}
/*同时下发PowerBus*/
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_UniversPara");
PowerBus_PackFillBuff(0x03,PowerBUS_CMD_SET_UniversPara,&para[PB_FMT_PARA + 1],para_len);
*ackLen = 1;
ackPara[0] = rev;
}
/*********************************************************************
* @fn PB_ACK_SET_PowerBus_EnablePara
* @brief BLV PB控制协议 - PB使能状态控制
* @return none
*/
void PB_ACK_SET_PowerBus_EnablePara(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA;
//*ackLen = 0;
if(para_len < 0x02) return ;
PB_Set_Power_State(para[PB_FMT_PARA]);
Dbg_Println(DBG_BIT_SYS_STATUS, "Power Enable %d",para[PB_FMT_PARA]);
if(para[PB_FMT_PARA + 1] == 0xF1){
if(g_PB.enable != g_eeprom.powerbus_enable){
g_eeprom.powerbus_enable = g_PB.enable;
EEPROM_WriteParaInfo(&g_eeprom); //保存参数
}
}
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}
/*********************************************************************
* @fn PB_ACK_PassThroug_Data
* @brief BLV PB控制协议 - PB透传命令
* @return none
*/
void PB_ACK_PassThroug_Data(U8_T *para,U8_T *ackPara,U16_T *ackLen){
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_PassThroug_Data");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_FillSendBuff(para[PB_FMT_PARA] + 0x01,&para[PB_FMT_PARA + 2],para[PB_FMT_PARA + 1]);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_LEDS_BRIGHTNESS
* @brief BLV PB控制协议 - PB总线 LED亮度 --
* @return none
*/
void PB_ACK_SET_PB_LEDS_BRIGHTNESS(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_LEDS_BRIGHTNESS");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_LEDS_BRIGHTNESS,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_LEDS_ADJUST
* @brief BLV PB控制协议 - PB总线 LED亮度递增递减调节 --
* @return none
*/
void PB_ACK_SET_PB_LEDS_ADJUST(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_LEDS_ADJUST");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_LEDS_ADJUST,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_LEDS_SWITCH
* @brief BLV PB控制协议 - PB总线 LED单开关状态 --
* @return none
*/
void PB_ACK_SET_PB_LEDS_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_LEDS_SWITCH");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_LEDS_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_LEDS_BRIGHT
* @brief BLV PB控制协议 - PB总线 LED亮度 --
* @return none
*/
void PB_ACK_SET_PB_LEDS_BRIGHT(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_LEDS_BRIGHT");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_LEDS_BRIGHT,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_LED_BRIGHTNESS
* @brief BLV PB控制协议 - PB总线 LED单回路亮度 --
* @return none
*/
void PB_ACK_SET_PB_LED_BRIGHTNESS(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_LED_BRIGHTNESS");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_LED_BRIGHTNESS,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_LED_Adjust
* @brief BLV PB控制协议 - PB总线 LED单回路亮度调节 --
* @return none
*/
void PB_ACK_SET_PB_LED_Adjust(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_LED_Adjust");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_LED_ADJUST,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_LED_SWITCH
* @brief BLV PB控制协议 - PB总线 LED单回路开关状态 --
* @return none
*/
void PB_ACK_SET_PB_LED_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_LED_SWITCH");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_LED_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_ALLLED_Switch
* @brief BLV PB控制协议 - PB总线 LED全部设备开关状态
* @return none
*/
void PB_ACK_SET_PB_ALLLED_Switch(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "PB_ACK_SET_PB_ALLLED_Switch");
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_ALLLED_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIPS_BRIGHTNESS
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_STRIPS_BRIGHTNESS(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
U8_T addr_field = 0;
U8_T pack_buff[60];
U8_T pack_len = 0;
U32_T ch_mask = 0;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s %d",__func__,para_len);
/*2024-06-20 修改主机这边组地址 按照64回路地址下发而PowerBus还是按照32回路一组控制因此需要手动分包*/
if(para_len == 0x4B){
if(PowerBUS_GetCommState() == 0x00){
addr_field = para[PB_FMT_PARA + 1]; //地址段 0~3正常地址段范围 大于4属于群控地址
ch_mask = para[PB_FMT_PARA + 5];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 4];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 3];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 2];
Dbg_Println(DBG_BIT_SYS_STATUS, "L ch_mask :%08x",ch_mask);
if(ch_mask != 0x00){
//判断前32回路是否有控制状态
//Dbg_Println(DBG_BIT_SYS_STATUS, "L ch_mask :%08x",ch_mask);
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2; //组地址
pack_buff[pack_len++] = para[PB_FMT_PARA + 2]; //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 3];
pack_buff[pack_len++] = para[PB_FMT_PARA + 4];
pack_buff[pack_len++] = para[PB_FMT_PARA + 5];
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //是否保存
pack_buff[pack_len++] = para[PB_FMT_PARA + 11]; //渐变时间
memcpy(&pack_buff[pack_len], &para[PB_FMT_PARA + 12], 32); //拷贝32回路的控制亮度
pack_len+=32;
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_BRIGHTNESS,pack_buff,pack_len);
}
ch_mask = para[PB_FMT_PARA + 9];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 8];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 7];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 6];
Dbg_Println(DBG_BIT_SYS_STATUS, "L ch_mask :%08x",ch_mask);
if(ch_mask != 0x00){
//判断后32回路是否有控制状态
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
//Dbg_Println(DBG_BIT_SYS_STATUS, "L ch_mask :%08x",ch_mask);
pack_buff[pack_len++] = addr_field*2+1; //组地址
pack_buff[pack_len++] = para[PB_FMT_PARA + 6]; //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 7];
pack_buff[pack_len++] = para[PB_FMT_PARA + 8];
pack_buff[pack_len++] = para[PB_FMT_PARA + 9];
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //是否保存
pack_buff[pack_len++] = para[PB_FMT_PARA + 11]; //渐变时间
memcpy(&pack_buff[pack_len], &para[PB_FMT_PARA + 44], 32); //拷贝32回路的控制亮度
pack_len+=32;
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_BRIGHTNESS,pack_buff,pack_len);
}
//回复当前PowerBus 通讯状态空闲,处理成功
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}else{
//回复当前PowerBus 通讯状态繁忙
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}else{
//回复当前PowerBus 参数错误
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_ParaError;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIPS_ADJUST
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_STRIPS_ADJUST(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
U8_T addr_field = 0;
U8_T pack_buff[60];
U8_T pack_len = 0;
U32_T ch_mask = 0;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
/*2024-06-20 修改主机这边组地址 按照64回路地址下发而PowerBus还是按照32回路一组控制因此需要手动分包*/
if(para_len == 12){
if(PowerBUS_GetCommState() == 0x00){
addr_field = para[PB_FMT_PARA + 1]; //地址段 0~3正常地址段范围 大于4属于群控地址
ch_mask = para[PB_FMT_PARA + 5];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 4];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 3];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 2];
if(ch_mask != 0x00){
//判断前32回路是否有控制状态
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2; //组地址
pack_buff[pack_len++] = para[PB_FMT_PARA + 2]; //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 3];
pack_buff[pack_len++] = para[PB_FMT_PARA + 4];
pack_buff[pack_len++] = para[PB_FMT_PARA + 5];
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //模式
pack_buff[pack_len++] = para[PB_FMT_PARA + 11]; //调节方向
pack_buff[pack_len++] = para[PB_FMT_PARA + 12]; //调节时间
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_SWITCH,pack_buff,pack_len);
}
ch_mask = para[PB_FMT_PARA + 9];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 8];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 7];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 6];
if(ch_mask != 0x00){
//判断后32回路是否有控制状态
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2+1; //组地址
pack_buff[pack_len++] = para[PB_FMT_PARA + 6]; //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 7];
pack_buff[pack_len++] = para[PB_FMT_PARA + 8];
pack_buff[pack_len++] = para[PB_FMT_PARA + 9];
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //模式
pack_buff[pack_len++] = para[PB_FMT_PARA + 11]; //调节方向
pack_buff[pack_len++] = para[PB_FMT_PARA + 12]; //调节时间
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_SWITCH,pack_buff,pack_len);
}
//回复当前PowerBus 通讯状态空闲,处理成功
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}else{
//回复当前PowerBus 通讯状态繁忙
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}else{
//回复当前PowerBus 参数错误
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_ParaError;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIPS_SWITCH
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_STRIPS_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
U8_T addr_field = 0;
U8_T pack_buff[60];
U8_T pack_len = 0;
U32_T ch_mask = 0,off_mask = 0,on_mask = 0;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s %02x",__func__,para_len);
/*2024-06-20 修改主机这边组地址 按照64回路地址下发而PowerBus还是按照32回路一组控制因此需要手动分包*/
if(para_len == 0x4A){
if(PowerBUS_GetCommState() == 0x00){
addr_field = para[PB_FMT_PARA + 1]; //地址段 0~3正常地址段范围 大于4属于群控地址
ch_mask = para[PB_FMT_PARA + 5];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 4];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 3];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 2];
Dbg_Println(DBG_BIT_SYS_STATUS, "L ch_mask :%08x",ch_mask);
if(ch_mask != 0x00){
//判断前32回路是否有控制状态
for(U8_T ch = 0;ch<32;ch++){
if( (ch_mask & (0x01<<ch)) != 0x00 ) {
//有控制状态 - 检查控制
if(para[PB_FMT_PARA + 11 + ch] == 0x01){
on_mask |= 0x01 << ch;
}else if(para[PB_FMT_PARA + 11 + ch] == 0x02){
off_mask |= 0x01 << ch;
}
}
}
if(on_mask != 0x00){
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2; //组地址
pack_buff[pack_len++] = (on_mask & 0xFF); //回路Mask
pack_buff[pack_len++] = ((on_mask>>8) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((on_mask>>16) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((on_mask>>24) & 0xFF); //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //是否保存
pack_buff[pack_len++] = 0x01; //开
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_ADJUST,pack_buff,pack_len);
}
if(off_mask != 0x00){
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2; //组地址
pack_buff[pack_len++] = (off_mask & 0xFF); //回路Mask
pack_buff[pack_len++] = ((off_mask>>8) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((off_mask>>16) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((off_mask>>24) & 0xFF); //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //是否保存
pack_buff[pack_len++] = 0x00; //关
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_ADJUST,pack_buff,pack_len);
}
}
//前32个回路发送完成后清除当前开关状态数据然后进行后32个回路开关状态数据的装填
on_mask = 0x00000000;
off_mask = 0x00000000;
ch_mask = para[PB_FMT_PARA + 9];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 8];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 7];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 6];
if(ch_mask != 0x00){
//判断后32回路是否有控制状态
for(U8_T ch = 0;ch<32;ch++){
if( (ch_mask & (0x01<<ch)) != 0x00 ) {
//有控制状态 - 检查控制
if(para[PB_FMT_PARA + 43 + ch] == 0x01){
on_mask |= 0x01 << ch;
}else if(para[PB_FMT_PARA + 43 + ch] == 0x02){
off_mask |= 0x01 << ch;
}
}
}
if(on_mask != 0x00){
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2+1; //组地址
pack_buff[pack_len++] = (on_mask & 0xFF); //回路Mask
pack_buff[pack_len++] = ((on_mask>>8) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((on_mask>>16) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((on_mask>>24) & 0xFF); //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //是否保存
pack_buff[pack_len++] = 0x01; //开
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_ADJUST,pack_buff,pack_len);
}
if(off_mask != 0x00){
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2+1; //组地址
pack_buff[pack_len++] = (off_mask & 0xFF); //回路Mask
pack_buff[pack_len++] = ((off_mask>>8) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((off_mask>>16) & 0xFF); //回路Mask
pack_buff[pack_len++] = ((off_mask>>24) & 0xFF); //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //是否保存
pack_buff[pack_len++] = 0x00; //关
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIPS_ADJUST,pack_buff,pack_len);
}
}
//回复当前PowerBus 通讯状态空闲,处理成功
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}else{
//回复当前PowerBus 通讯状态繁忙
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}else{
//回复当前PowerBus 参数错误
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_ParaError;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIP_SWITCH
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_STRIP_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIP_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIP_BRIGHTNESS
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_STRIP_BRIGHTNESS(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIP_BRIGHTNESS,&para[PB_FMT_PARA + 1],para_len);
}else{
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIP_Adjust
* @brief BLV PB控制协议 - PB总线 LS -
* @return none
*/
void PB_ACK_SET_PB_STRIP_Adjust(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIP_ADJUST,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIP_RELATIVE_GROUP_ADJUST
* @brief BLV PB控制协议 - PB总线 LS -
* @return none
*/
void PB_ACK_SET_PB_STRIP_RELATIVE_GROUP_ADJUST(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
U8_T addr_field = 0;
U8_T pack_buff[60];
U8_T pack_len = 0;
U32_T ch_mask = 0;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
/*2024-07-02 修改主机这边组地址 按照64回路地址下发而PowerBus还是按照32回路一组控制因此需要手动分包*/
if(para_len == 12){
if(PowerBUS_GetCommState() == 0x00){
addr_field = para[PB_FMT_PARA + 1]; //地址段 0~3正常地址段范围 大于4属于群控地址
ch_mask = para[PB_FMT_PARA + 5];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 4];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 3];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 2];
if(ch_mask != 0x00){
//判断前32回路是否有控制状态
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2; //组地址
pack_buff[pack_len++] = para[PB_FMT_PARA + 2]; //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 3];
pack_buff[pack_len++] = para[PB_FMT_PARA + 4];
pack_buff[pack_len++] = para[PB_FMT_PARA + 5];
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //模式
pack_buff[pack_len++] = para[PB_FMT_PARA + 11]; //相对调节亮度值
pack_buff[pack_len++] = para[PB_FMT_PARA + 12]; //只调亮的回路
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIP_RELATIVE_GROUP_ADJUST,pack_buff,pack_len);
}
ch_mask = para[PB_FMT_PARA + 9];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 8];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 7];
ch_mask <<= 8;
ch_mask |= para[PB_FMT_PARA + 6];
if(ch_mask != 0x00){
//判断后32回路是否有控制状态
memset(pack_buff, 0, sizeof(pack_buff));
pack_len = 0;
pack_buff[pack_len++] = addr_field*2+1; //组地址
pack_buff[pack_len++] = para[PB_FMT_PARA + 6]; //回路Mask
pack_buff[pack_len++] = para[PB_FMT_PARA + 7];
pack_buff[pack_len++] = para[PB_FMT_PARA + 8];
pack_buff[pack_len++] = para[PB_FMT_PARA + 9];
pack_buff[pack_len++] = para[PB_FMT_PARA + 10]; //模式
pack_buff[pack_len++] = para[PB_FMT_PARA + 11]; //相对调节亮度值
pack_buff[pack_len++] = para[PB_FMT_PARA + 12]; //只调亮的回路
Dbg_Print_Buff(DBG_BIT_SYS_STATUS, "Pack BUFF",pack_buff,pack_len);
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIP_RELATIVE_GROUP_ADJUST,pack_buff,pack_len);
}
//回复当前PowerBus 通讯状态空闲,处理成功
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
}else{
//回复当前PowerBus 通讯状态繁忙
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}else{
//回复当前PowerBus 参数错误
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_ParaError;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_STRIP_RELATIVE_ADJUST
* @brief BLV PB控制协议 - PB总线 LS -
* @return none
*/
void PB_ACK_SET_PB_STRIP_RELATIVE_ADJUST(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_STRIP_RELATIVE_ADJUST,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_ALLSTRIP_Switch
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_ALLSTRIP_Switch(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_ALLSTRIP_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_RELAYS_SWITCH
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_RELAYS_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_RELAYS_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_ALLRELAY_SWITCH
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_ALLRELAY_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_ALLRELAY_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_RELAY_SWITCH
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_RELAY_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_RELAY_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn PB_ACK_SET_PB_RELAY_DELAY_SWITCH
* @brief BLV PB控制协议 - PB总线
* @return none
*/
void PB_ACK_SET_PB_RELAY_DELAY_SWITCH(U8_T *para,U8_T *ackPara,U16_T *ackLen){
U8_T para_len = para[PB_FMT_LEN] - PB_FMT_PARA - 1;
Dbg_Println(DBG_BIT_SYS_STATUS, "%s",__func__);
if(PowerBUS_GetCommState() == 0x00){
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_Succ;
PowerBus_PackFillBuff(para[PB_FMT_PARA]+1,PowerBUS_CMD_SET_RELAY_DELAY_SWITCH,&para[PB_FMT_PARA + 1],para_len);
}else{
*ackLen = 1;
ackPara[0] = PB_CMD_Reply_CommStateBusy;
}
}
/*********************************************************************
* @fn BLV_PB_Control_Protocol_Processing
* @brief BLV PB控制协议处理函数(BLV_A8 PB控制协议)
* @return none
*/
U8_T BLV_PB_Control_Protocol_Processing(U8_T *data,U16_T len){
U8_T ack_flag = 0;
//目前RCU地址为0x00
if(data[PB_FMT_ADDR_TX] != 0x00){
Dbg_Println(DBG_BIT_SYS_STATUS, "PB Tx Addr Error!");
return 0x01;
}
//目前PB地址为0x01
if(data[PB_FMT_ADDR_RX] != 0x01){
Dbg_Println(DBG_BIT_SYS_STATUS, "PB Rx Addr Error!");
return 0x01;
}
if(PB_CheckSum(data,len) != 0x00){
Dbg_Println(DBG_BIT_SYS_STATUS, "PB Check Fail!!!!");
return 0x01;
}
if(data[PB_FMT_LEN] != len){
Dbg_Println(DBG_BIT_SYS_STATUS, "PB Len Fail %d - %d!!!!",data[PB_FMT_LEN],len);
return 0x01;
}
if(data[PB_FMT_DEV_TYPE] != PB_DEV_TYPE){
Dbg_Println(DBG_BIT_SYS_STATUS, "PB TYPE Fail %d - %d!!!!",data[PB_FMT_DEV_TYPE],PB_DEV_TYPE);
return 0x02;
}
g_PB.recv_cmd = data[PB_FMT_CMD];
if((data[PB_FMT_TYPE] & 0x0F) != g_PB.recv_sn){
g_PB.recv_sn = data[PB_FMT_TYPE] & 0x0F;
g_PB.recv_addr = data[PB_FMT_ADDR_TX];
switch(data[PB_FMT_CMD]){
case PB_CMD_GET_STATE: //查询当前状态
PB_ACK_GET_STATE(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_STRIP_BRIGHTNESS: //设定灯带亮度
PB_ACK_SET_LED_BRIGHTNESS(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_STRIP_SWITCH: //设定灯带开关状态
PB_ACK_SET_STRIP_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_STRIP_ADJUST:
PB_ACK_SET_STRIP_ADJUST(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PIRTIGGLE_LED:
PB_ACK_SET_PIRTIGGLE_LED(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_CurrTiggleStrip:
PB_ACK_SET_CurrTiggleStrip(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_SaveCurrInfo:
PB_ACK_SET_SaveCurrInfo(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_GET_SaveCurrInfo:
PB_ACK_GET_SaveCurrInfo(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_UniversPara:
PB_ACK_SET_UniversPara(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PowerBus_Enable:
PB_ACK_SET_PowerBus_EnablePara(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_PassThroug_Data:
PB_ACK_PassThroug_Data(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_LEDS_BRIGHTNESS: //设定PB总线 LED亮度 --按照地址段控制 单独控制回路亮度
PB_ACK_SET_PB_LEDS_BRIGHTNESS(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_LEDS_ADJUST: //设定PB总线 LED亮度递增递减调节 --按照地址段控制
PB_ACK_SET_PB_LEDS_ADJUST(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_LEDS_SWITCH: //设定PB总线 LED开关状态 --按照地址段控制
PB_ACK_SET_PB_LEDS_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_LEDS_BRIGHT: //设定PB总线 LED亮度 --按照地址段控制
PB_ACK_SET_PB_LEDS_BRIGHT(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_LED_SWITCH: //设定PB总线 LED单开关状态 --按照单个回路控制
PB_ACK_SET_PB_LED_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_LED_BRIGHTNESS: //设定PB总线 LED单回路亮度 --按照单个回路控制
PB_ACK_SET_PB_LED_BRIGHTNESS(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_LED_Adjust: //设定PB总线 LED单回路亮度 --按照单个回路控制
PB_ACK_SET_PB_LED_Adjust(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_ALLLED_Switch: //设定PB总线 LED单回路亮度 --按照单个回路控制
PB_ACK_SET_PB_ALLLED_Switch(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIPS_BRIGHTNESS: //PB 恒压调光 设定灯带亮度 --按照地址段控制
PB_ACK_SET_PB_STRIPS_BRIGHTNESS(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIPS_ADJUST: //PB 恒压调光 设定灯带递增、递减 --按照地址段控制
PB_ACK_SET_PB_STRIPS_ADJUST(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIPS_SWITCH: //PB 恒压调光 设定灯带开关状态 --按照地址段控制
PB_ACK_SET_PB_STRIPS_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_ALLSTRIP_Switch: //PB 恒压调光 设定灯带全部开关状态
PB_ACK_SET_PB_ALLSTRIP_Switch(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIP_SWITCH: //PB 恒压调光 设定灯带开关状态 --按照指定回路
PB_ACK_SET_PB_STRIP_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIP_BRIGHTNESS: //PB 恒压调光 设定灯带亮度 --按照指定回路
PB_ACK_SET_PB_STRIP_BRIGHTNESS(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIP_Adjust: //PB 恒压调光 设定灯带递增、递减 --按照指定回路
PB_ACK_SET_PB_STRIP_Adjust(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIP_RELATIVE_GROUP_ADJUST: //PB 恒压调光 设定灯带相对亮度 --按照地址段控制
PB_ACK_SET_PB_STRIP_RELATIVE_GROUP_ADJUST(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_STRIP_RELATIVE_ADJUST: //PB 恒压调光 设定灯带相对亮度 --按照指定回路
PB_ACK_SET_PB_STRIP_RELATIVE_ADJUST(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_RELAYS_SWITCH:
PB_ACK_SET_PB_RELAYS_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_ALLRELAY_SWITCH:
PB_ACK_SET_PB_ALLRELAY_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_RELAY_SWITCH:
PB_ACK_SET_PB_RELAY_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
case PB_CMD_SET_PB_RELAY_DELAY_SWITCH:
PB_ACK_SET_PB_RELAY_DELAY_SWITCH(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
ack_flag = 0x01;
break;
}
}else if((data[PB_FMT_TYPE] & 0x40) == 0x40){
//重发标志位置位 - 回复应答数据,但是不处理
switch(data[PB_FMT_CMD]){
case PB_CMD_GET_STATE:
PB_ACK_GET_STATE(data,&g_PB.ackbuff[PB_FMT_PARA],&g_PB.ackLen);
break;
}
PB_RS485_ReplyAck();
}
if(ack_flag == 0x01){
PB_RS485_ReplyAck();
}
return 0x00;
}
/*********************************************************************
* @fn Get_ADC_Val_Filter
* @brief ADC平滑滤波后的值
*/
U32_T Get_ADC_Val_Filter(U16_T *data,U8_T data_len){
U32_T sum_val = 0;
U16_T age_val = 0;
U8_T sum_cnt = 0;
for(sum_cnt = 0;sum_cnt < data_len;sum_cnt++){
sum_val += data[sum_cnt];
}
age_val = (sum_val / data_len) & 0xFFFF;
return age_val;
}
/*获取电流值*/
U16_T Get_PB_CURR_VAL(void){
U16_T Temp_val = Get_ADC_Val_Filter(g_PB.meas_hv_CURRPWR_Buff,MEAS_Debounce_Num);
g_PB.meas_powerbus_curr = (Temp_val * 16500 ) / 4096;
return g_PB.meas_powerbus_curr;
}
/*********************************************************************
* @fn PMU_MEAS_Task
* @brief PB - 4ADC检测
*/
void PMU_MEAS_Task(void){
static U32_T meas_tick = 0;
U32_T temp_val = 0,convert_val = 0;
if(SysTick_1ms - meas_tick >= 30){
meas_tick = SysTick_1ms;
if(g_PB.meas_cnt >= MEAS_BUFFER_SIZE) {
g_PB.meas_fill_flag = 0x01;
g_PB.meas_cnt = 0;
}
ADC12_SEQEND_wait(0);
g_PB.meas_hv_PB_val[g_PB.meas_cnt] = ADC12_DATA_OUPUT(0);
ADC12_SEQEND_wait(1);
g_PB.meas_hv_PS_val[g_PB.meas_cnt] = ADC12_DATA_OUPUT(1);
ADC12_SEQEND_wait(2);
g_PB.meas_hv_CURRPWRx5_val = ADC12_DATA_OUPUT(2);
ADC12_SEQEND_wait(3);
g_PB.meas_hv_CURRPWRx50_val = ADC12_DATA_OUPUT(3);
/* 检测PB输出 - 负载电流
* 2023 - 10 - 21 使X5挡位的检测 使x50挡位
*
* */
// if(g_PB.meas_hv_curr_ward == 0x01){
// if(g_PB.meas_hv_CURRPWRx5_val <= 500){
// g_PB.meas_hv_curr_toggle++;
// if(g_PB.meas_hv_curr_toggle >= 3){
// g_PB.meas_hv_curr_toggle = 0;
// g_PB.meas_hv_curr_ward = 0x00; //切换至低挡位
// }
// }else{
// g_PB.meas_hv_curr_toggle = 0;
// }
//
// g_PB.meas_hv_CURRPWR_Buff[g_PB.meas_hv_curr_cnt] = g_PB.meas_hv_CURRPWRx5_val;
//
// }else {
// if(g_PB.meas_hv_CURRPWRx50_val >= 3500){
// g_PB.meas_hv_curr_toggle++;
// if(g_PB.meas_hv_curr_toggle >= 3){
// g_PB.meas_hv_curr_toggle = 0;
// g_PB.meas_hv_curr_ward = 0x01; //切换至高挡位
// }
// }else{
// g_PB.meas_hv_curr_toggle = 0;
// }
//
// g_PB.meas_hv_CURRPWR_Buff[g_PB.meas_hv_curr_cnt] = g_PB.meas_hv_CURRPWRx50_val;
// }
if(g_PB.meas_hv_curr_cnt >= MEAS_Debounce_Num){
g_PB.meas_hv_curr_cnt = 0;
}
g_PB.meas_hv_CURRPWR_Buff[g_PB.meas_hv_curr_cnt++] = g_PB.meas_hv_CURRPWRx5_val;
Get_PB_CURR_VAL();
PB_Current_Monitoring_Meas();
//Dbg_Println(DBG_BIT_SYS_STATUS,"Meas PB Curr %dmA",Get_PB_CURR_VAL());
//以下内容为输出电源检测
g_PB.meas_cnt++;
if(g_PB.meas_fill_flag != 0x01) return ; //检测BUFF未满,直接退出
g_PB.meas_fill_flag = 0x00; //重新开始计数
/*Meas PB Voltage 检测OK后才打开PB输出电源*/
temp_val = Get_ADC_Val_Filter(g_PB.meas_hv_PB_val,MEAS_BUFFER_SIZE);
g_PB.meas_powerbus_volt = (temp_val * 3300 * 16) / 4096; //输入电压 = 检测电压 * 16
// Dbg_Println(DBG_BIT_SYS_STATUS,"Meas PB Voltage:%dmv",g_PB.meas_powerbus_volt);
if( (g_PB.meas_powerbus_volt >= MEAS_InputVoltage_Min) && (g_PB.meas_powerbus_volt <= MEAS_InputVoltage_Max) ){
g_PB.meas_hv_PB_ONcnt++;
g_PB.meas_hv_PB_OFFcnt = 0x00;
if(g_PB.meas_hv_PB_ONcnt >= MEAS_Debounce_Num){
g_PB.meas_hv_PB_ONcnt = 0x00;
g_PB.meas_hv_PB_State = 0x01;
//Dbg_Println(DBG_BIT_SYS_STATUS,"Meas PB Voltage ON %dmV",g_PB.meas_powerbus_volt);
}
}else {
g_PB.meas_hv_PB_ONcnt = 0x00;
g_PB.meas_hv_PB_OFFcnt++;
if(g_PB.meas_hv_PB_OFFcnt >= MEAS_Debounce_Num){
g_PB.meas_hv_PB_OFFcnt = 0x00;
g_PB.meas_hv_PB_State = 0x00;
//Dbg_Println(DBG_BIT_SYS_STATUS,"Meas PB Voltage OFF %dmV",g_PB.meas_powerbus_volt);
}
}
/*Meas PS Voltage 检测输入OK后才打开PB输出电源*/
temp_val = Get_ADC_Val_Filter(g_PB.meas_hv_PS_val,MEAS_BUFFER_SIZE);
g_PB.meas_powerstrip_volt = (temp_val * 3300 * 16) / 4096;
// Dbg_Println(DBG_BIT_SYS_STATUS,"Meas PS Voltage:%dmv",g_PB.meas_powerstrip_volt);
if( (g_PB.meas_powerstrip_volt >= MEAS_InputVoltage_Min) && (g_PB.meas_powerstrip_volt <= MEAS_InputVoltage_Max)){
g_PB.meas_hv_PS_ONcnt++;
g_PB.meas_hv_PS_OFFcnt = 0x00;
if(g_PB.meas_hv_PS_ONcnt >= MEAS_Debounce_Num){
g_PB.meas_hv_PS_ONcnt = 0x00;
g_PB.meas_hv_PS_State = 0x01;
//Dbg_Println(DBG_BIT_SYS_STATUS,"Meas PS Voltage ON %dmV",g_PB.meas_powerstrip_volt);
}
}else {
g_PB.meas_hv_PS_ONcnt = 0x00;
g_PB.meas_hv_PS_OFFcnt++;
if(g_PB.meas_hv_PS_OFFcnt >= MEAS_Debounce_Num){
g_PB.meas_hv_PS_OFFcnt = 0x00;
g_PB.meas_hv_PS_State = 0x00;
//Dbg_Println(DBG_BIT_SYS_STATUS,"Meas PS Voltage OFF %dmV",g_PB.meas_powerstrip_volt);
}
}
}
if(g_PB.meas_hv_PB_State != g_PB.last_meas_hv_PB_State) {
g_PB.last_meas_hv_PB_State = g_PB.meas_hv_PB_State;
Dbg_Println(DBG_BIT_SYS_STATUS,"HV PB State Change : %d",g_PB.last_meas_hv_PB_State);
switch(g_PB.last_meas_hv_PB_State) {
case 0x01: //开启PB输出
DRV_PB36V_ON;
break;
case 0x00: //关闭PB输出
DRV_PB36V_OFF;
break;
}
}
if(g_PB.meas_hv_PS_State != g_PB.last_meas_hv_PS_State){
g_PB.last_meas_hv_PS_State = g_PB.meas_hv_PS_State;
Dbg_Println(DBG_BIT_SYS_STATUS,"HV PS State Change : %d",g_PB.last_meas_hv_PS_State);
switch(g_PB.last_meas_hv_PS_State) {
case 0x01: //开启PS输出
DRV_PS36V_ON;
break;
case 0x00: //关闭PS输出
DRV_PS36V_OFF;
break;
}
}
}
//检测电流突变功能
U16_T Current_Coarse_Filter(U16_T vsens){
U8_T i=0;
U16_T rev = 0;
U32_T filter_sum = 0;
curr_monitoring.coarse_filter_buff[Filter_Coarse_Size] = vsens;
for(i=0;i<Filter_Coarse_Size;i++){
curr_monitoring.coarse_filter_buff[i] = curr_monitoring.coarse_filter_buff[i+1];
filter_sum += curr_monitoring.coarse_filter_buff[i];
}
rev = (U16_T)(filter_sum / Filter_Coarse_Size);
return rev;
}
U16_T Current_Fine_Filter(U16_T vsens){
U8_T i=0;
U16_T rev = 0;
U32_T filter_sum = 0;
curr_monitoring.fine_filter_buff[Filter_Fine_Size] = vsens;
for(i=0;i<Filter_Fine_Size;i++){
curr_monitoring.fine_filter_buff[i] = curr_monitoring.fine_filter_buff[i+1];
filter_sum += curr_monitoring.fine_filter_buff[i];
}
rev = (U16_T)(filter_sum / Filter_Fine_Size);
return rev;
}
void PB_Current_Monitoring_Meas(void){
U16_T coarse_val = 0,fine_val = 0;
int temp_diff_val = 0,temp_power = 0;
if(curr_monitoring.fun_enable != 0x01) return ;
coarse_val = Current_Coarse_Filter(g_PB.meas_powerbus_curr);
fine_val = Current_Fine_Filter(g_PB.meas_powerbus_curr);
curr_monitoring.curr_diff_val = coarse_val - fine_val;
temp_diff_val = abs(curr_monitoring.curr_diff_val);
temp_power = temp_diff_val * g_PB.meas_powerbus_volt / 1000;
if(curr_monitoring.dead_switch != 0x00){
//根据控制时间来决定短期失效多久
// if(SysTick_1ms - curr_monitoring.dead_tick < curr_monitoring.dead_time){
// /*短期失效时间内*/
// return ;
// }else{
// curr_monitoring.dead_switch = 0x00;
// curr_monitoring.dead_tick = SysTick_1ms;
// }
//根据当前是否处于稳定范围
if(temp_power <= 1000){
curr_monitoring.release_debounce_cnt++;
if(curr_monitoring.release_debounce_cnt >= 20){
curr_monitoring.dead_switch = 0x00;
curr_monitoring.release_debounce_cnt = 0;
}
}else{
curr_monitoring.release_debounce_cnt = 0;
}
Dbg_Println(DBG_BIT_SYS_STATUS,"Curr Monit: %d - %dmW JUMP %d",temp_diff_val,temp_power,curr_monitoring.release_debounce_cnt);
return ;
}
Dbg_Println(DBG_BIT_SYS_STATUS,"Curr Monit: %d - %dmW",temp_diff_val,temp_power);
/*触发/消抖阈值是以功率为标准,所以需要转化一下*/
if(curr_monitoring.curr_diff_val >= 0){
if(temp_power >= curr_monitoring.trigger_threshold){
curr_monitoring.trigger_debounce_cnt++;
if(curr_monitoring.trigger_debounce_cnt >= curr_monitoring.trigger_debounce_num){
curr_monitoring.pb_state = 0x01;
curr_monitoring.trigger_debounce_cnt = 0;
}
}else{
curr_monitoring.trigger_debounce_cnt = 0;
}
}else if(curr_monitoring.curr_diff_val < 0){
if(temp_power >= curr_monitoring.release_threshold){
curr_monitoring.release_debounce_cnt++;
if(curr_monitoring.release_debounce_cnt >= curr_monitoring.release_debounce_num){
curr_monitoring.pb_state = 0x00;
curr_monitoring.release_debounce_cnt = 0;
}
}else{
curr_monitoring.release_debounce_cnt = 0;
}
}
if(curr_monitoring.pb_state != curr_monitoring.last_pb_state){
curr_monitoring.last_pb_state = curr_monitoring.pb_state;
Dbg_Println(DBG_BIT_SYS_STATUS,"curr_monitoring state: %d",curr_monitoring.pb_state);
if(curr_monitoring.pb_state == 0x01){
PWM_SetOutBrightness(PWM_OUT_CH1,curr_monitoring.triggle_strip_bright[PWM_OUT_CH1]);
PWM_SetOutBrightness(PWM_OUT_CH2,curr_monitoring.triggle_strip_bright[PWM_OUT_CH2]);
PWM_SetOutBrightness(PWM_OUT_CH3,curr_monitoring.triggle_strip_bright[PWM_OUT_CH3]);
PWM_SetOutBrightness(PWM_OUT_CH4,curr_monitoring.triggle_strip_bright[PWM_OUT_CH4]);
}else{
PWM_SetOutBrightness(PWM_OUT_CH1,curr_monitoring.release_strip_bright[PWM_OUT_CH1]);
PWM_SetOutBrightness(PWM_OUT_CH2,curr_monitoring.release_strip_bright[PWM_OUT_CH2]);
PWM_SetOutBrightness(PWM_OUT_CH3,curr_monitoring.release_strip_bright[PWM_OUT_CH3]);
PWM_SetOutBrightness(PWM_OUT_CH4,curr_monitoring.release_strip_bright[PWM_OUT_CH4]);
}
}
//Dbg_NoTick_Println(DBG_BIT_Debug_STATUS,"%d,%d,%d,%d",coarse_val,fine_val,curr_monitoring.curr_diff_val,curr_monitoring.pb_state);
}
/*让PB触发电流失效一段时间*/
void Set_PB_CurrMonitoring_Dead(void){
curr_monitoring.dead_switch = 0x01;
//根据时间
// curr_monitoring.dead_time = time;
// curr_monitoring.dead_tick = SysTick_1ms;
//根据稳定
curr_monitoring.release_debounce_cnt = 0;
}
void PB_Task(void){
PB_Soft_Boot_Task();
PB_Protect_Task();
PowerBus_SendBuffer_Task();
PMU_MEAS_Task();
}