/* * blv_dev_action.c * * Created on: Nov 11, 2025 * Author: cc */ #include "includes.h" BLV_DevAction_Manage_G DevActionGlobal; //设备信息全局变量 #define Action_Group_Ctrl_Num 30 //动作数据中单个类型 群控个数上限 /******************************************************************************* * Function Name : Expand_And_Dimm_Action_Get * Description : 扫描动作组中的继电器类型与调光类型的动作,将其添加到群控数组中 * 疑问点 1:这个函数是不是可以优化,目前只可以群控继电器类型与调光类型的动作数据 * 疑问点 2:群控数组是不是可以使用同一个,继电器类型与调光类型为啥需要分开,为啥需要这样弄 ,这个方式是不是可以优化 * 调光类型与继电器类型分开,这样遍历的话,只需遍历一遍。。。。。。但是后面还有一次遍历 * Input : * DevActionInfo - 动作组信息 * expand_type - 继电器群控数组 * dimm_type - 调光群控数组 * on_off - 群控状态 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void Expand_And_Dimm_Action_Get(DEV_ACTION_INFO *DevActionInfo,EXPAND_TYPE_G *expand_type,DIMM_TYPE_G *dimm_type,uint8_t on_off) { uint8_t TNum = 0x00; //地址相同计数 uint8_t i = 0x00,j = 0x00; uint8_t expandexnum=0; //继电器存在计数 #if RS485_LED_Flag uint8_t dimmexnum=0; //调光存在计数 #endif for(i = 0; i < DevActionInfo->DevCtrlNum; i++ ) { //遍历继电器 状态 if( (expandexnum == 0) && (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType == Dev_Host_HVout) ) { expand_type[expandexnum].Addr = DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr; expandexnum++; }else if( (expandexnum > 0) && (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType == Dev_Host_HVout) ) { for(j = 0; j <= expandexnum; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { TNum++; break; } } if(TNum == 0x00) { expand_type[expandexnum].Addr = DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr; expandexnum++; } else if(TNum > 0) { TNum = 0x00; } } #if RS485_LED_Flag //遍历调光设备 状态 if( (dimmexnum == 0x00) && (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType == DEV_RS485_PWM) ) { dimm_type[dimmexnum].Addr = DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr; dimmexnum++; } else if( (dimmexnum > 0) && (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType == DEV_RS485_PWM) ) { for(j = 0; j <= dimmexnum; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == dimm_type[j].Addr) { TNum++; break; } } if(TNum == 0x00) { dimm_type[dimmexnum].Addr = DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr; dimmexnum++; } else if(TNum > 0) { TNum = 0x00; } } #endif } for(i = 0; i < DevActionInfo->DevCtrlNum; i++) //第一次遍历,将相同的设备放到一起 { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00 ) //立即执行才参与判断 { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType == Dev_Host_HVout) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop < HVoutNumMAX) { for(j = 0 ; j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { expand_type[j].ExpandReadFlag|= 0x01<DevActionOutput[i].DevActionOutCfg.DevOutputLoop; //控制标志位 - 置位 if(on_off == 0x01) { expand_type[j].ExpandReadState[DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop]= DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState; }else if(on_off == 0x00) { expand_type[j].ExpandReadState[DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop]= DEV_CTRLWAY_CLOSE; } } } } } #if RS485_LED_Flag else if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType == DEV_RS485_PWM) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop < LED_OUT_CH_MAX) { for(j = 0; j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == dimm_type[j].Addr) { dimm_type[j].DimmReadFlag |= 0x01<DevActionOutput[i].DevActionOutCfg.DevOutputLoop; if(on_off == 0x01) { dimm_type[j].DimmReadState[DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop] = DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState; }else if(on_off == 0x02) { dimm_type[j].DimmReadState[DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop] = DEV_CTRLWAY_CLOSE; } } } } } #endif } } } /******************************************************************************* * Function Name : RcuLockState_Scan * Description : RCU锁定状态扫描 - 从正常到授权,取电服务会关闭 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void RcuLockState_Scan(void) { uint8_t LockState; LockState = Get_Authorize_Lock_Status(); //拿到RCU的锁状态 1,锁定 0,正常 if(DevActionGlobal.DevActionU64Cond.RcuLockState != LockState) { DevActionGlobal.DevActionU64Cond.RcuLockState = LockState; //同步 switch(DevActionGlobal.DevActionU64Cond.RcuLockState) { case 0x01: //锁定 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"RCU已锁定,导致取电服务关闭"); //Ele_Ctrl_OpenClose(0x02); //断电 break; case 0x00: //正常 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"RCU已解锁,欢迎正常使用"); break; } } } /******************************************************************************* * @Function Name : CondJudge * @Description : 单个条件判断 * @Input : * State1 : 动作中的条件,0x00 不判断,其他值:判断条件值 * State2 :实际条件状态值 * @Return :1条件满足 0条件不满足 *******************************************************************************/ __attribute__((section(".non_0_wait"))) uint8_t CondJudge(uint8_t State1, uint8_t State2) { if( (0x00 == State1) || ( (0x00 != State1) && (State1 == State2) )) { return CondIsPass; }else{ return CondIsNotPass; } } /******************************************************************************* * @Function Name : BLV_DevAction_Cond_Judge * @Description : 设备动作条件判断函数 * @Input : * DevActionAddr : 设备动作地址 * @Return :1条件满足 0条件不满足 主要两种条件 全局条件有8位 普通条件56位 * @Attention : 判断8个字节的条件,满足就返回1,不满足就返回0 *******************************************************************************/ __attribute__((section(".non_0_wait"))) uint8_t BLV_DevAction_Cond_Judge(DEV_ACTION_INFO *DevActionInfo) { if(0x01 == DevActionInfo->DevActionCond.DevActionU64Cond.DevActionOutFlag) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作已锁定"); return CondIsNotPass; //锁定,直接返回条件不成立 } if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.RoomState, DevActionGlobal.DevActionU64Cond.RoomState)){Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"房态未判断通过"); return CondIsNotPass; } //房态 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.EleState, DevActionGlobal.DevActionU64Cond.EleState)){Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"取电未判断通过"); return CondIsNotPass; } //取电 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.DndState, DevActionGlobal.DevActionU64Cond.DndState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"勿扰未判断通过"); return CondIsNotPass; } //勿扰 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.CleanState, DevActionGlobal.DevActionU64Cond.CleanState)){Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"清理未判断通过"); return CondIsNotPass; } //清理 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.CallState, DevActionGlobal.DevActionU64Cond.CallState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"呼叫未判断通过"); return CondIsNotPass; } //呼叫 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.WashState, DevActionGlobal.DevActionU64Cond.WashState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"洗衣未判断通过"); return CondIsNotPass; } //洗衣 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.CheckOutState, DevActionGlobal.DevActionU64Cond.CheckOutState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"退房未判断通过"); return CondIsNotPass; } //退房 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.WaitState, DevActionGlobal.DevActionU64Cond.WaitState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"稍后未判断通过"); return CondIsNotPass; } //稍后 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.SosState, DevActionGlobal.DevActionU64Cond.SosState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"SOS未判断通过"); return CondIsNotPass; } //SOS if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.RentState, DevActionGlobal.DevActionU64Cond.RentState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"预约待租未判断通过"); return CondIsNotPass; } //预约待租 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.LockState, DevActionGlobal.DevActionU64Cond.LockState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"开锁未判断通过"); return CondIsNotPass; } //开锁 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.LuggageState, DevActionGlobal.DevActionU64Cond.LuggageState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"行李未判断通过"); return CondIsNotPass; } //行李 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.StrongState, DevActionGlobal.DevActionU64Cond.StrongState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"保险箱未判断通过"); return CondIsNotPass; } //保险箱 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.DoorState, DevActionGlobal.DevActionU64Cond.DoorState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"门磁未判断通过"); return CondIsNotPass; } //门磁 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.SeasonState, DevActionGlobal.DevActionU64Cond.SeasonState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"季节未判断通过"); return CondIsNotPass; } //季节 if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.TimeState, DevActionGlobal.DevActionU64Cond.TimeState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"时间未判断通过"); return CondIsNotPass; } //时间 // if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.NeightFlag, DevActionInfo->DevActionCond.DevActionU64Cond.NeightState, DevActionGlobal.DevActionU64Cond.NeightState)){Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"起夜未判断通过"); return CondIsNotPass; } //起夜 // if(CondIsNotPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.RcuLockState, DevActionGlobal.DevActionU64Cond.RcuLockState)) {Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"授权条件未判断通过,场景名:%s",DevActionInfo->DevActionCore.DevActionName); return CondIsNotPass; } //锁定 DevActionGlobal.DevActionU64Cond.RcuLockState if( (0x00 != DevActionInfo->DevActionCond.DevActionU64Cond.RcuLockState) && ( ((0x01 == DevActionInfo->DevActionCond.DevActionU64Cond.RcuLockState)&&(0x00 == DevActionGlobal.DevActionU64Cond.RcuLockState)) ||((0x02 == DevActionInfo->DevActionCond.DevActionU64Cond.RcuLockState)&&(0x01 == DevActionGlobal.DevActionU64Cond.RcuLockState) ) ) ) { //锁定 Dbg_Println(DBG_BIT_ActCond_STATUS_bit,"授权条件未判断通过,场景名:%s",DevActionInfo->DevActionCore.DevActionName); return CondIsNotPass; } return CondIsPass; } /******************************************************************************* * Function Name : Expand_State_Get * Description : 扩展场景状态得到函数 遍历所有该场景下的所有回路状态 * 待优化: 优化思路, * 1、群控的目的是为了减少从外部SRAM读取设备数据,这样虽然减少了读取设备数据,但是增加了,大量的临时变量 * 2、这个函数的目的是遍历当前场景下所有动作回路的状态,从而判断当前场景状态是开还是关;但是每个设备状态都不一样,还有部分特殊逻辑在这里转换 * 比如窗帘状态判断,色温状态判断。。。。 * 这些判断应该由设备驱动完成,不应该由设备动作执行来转换 * 疑问点: * if(DevActionInfo->DevActionCond.SceneExcute != ACTION_SCENE_SLEEP) 这个判断作用是什么,为什么睡眠模式下不判断 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void Expand_State_Get(DEV_ACTION_INFO *DevActionInfo) { uint8_t i = 0x00,j = 0x00; uint32_t DevAddrOut = 0x00; //设备地址局部变量 uint8_t DevCtrlWay = 0x00; //执行方式 uint8_t DevCtrlCont = 0x00; //执行内容 uint8_t SceneState = DEV_STATE_OPEN; uint8_t SceneType = 0x01; Device_Public_Information_G BUS_Public; EXPAND_TYPE_G expand_type[Action_Group_Ctrl_Num]={0}; DIMM_TYPE_G dimm_type[Action_Group_Ctrl_Num]={0}; Expand_And_Dimm_Action_Get(DevActionInfo,expand_type,dimm_type,0x01); //将继电器类型与调光类型的动作先挑出来 /* * 1、先会循环动作中的继电器类型与调光类型,有多少个动作会循环多少次 * 2、当判断到继电器类型或调光类型时,还需要循环30次群动作,找到当前动作对应的群控制 * */ for(i = 0; i < DevActionInfo->DevCtrlNum; i++ ) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_HVout: //继电器设备类型 for(j = 0;j < Action_Group_Ctrl_Num;j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { if(expand_type[j].ExpandReadFlag != 0x00) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevActionInfo->DevActionOutput[i].DevActionOutAddr); //拷贝所有共有数据 if(NULL != BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr) { if(DEV_STATE_CLOSE == BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr(DevActionInfo->DevActionOutput[i].DevActionOutAddr, SceneType, expand_type[j].ExpandReadFlag, HVoutNumMAX, expand_type[j].ExpandReadState)) { SceneState = DEV_STATE_CLOSE; } } expand_type[j].ExpandReadFlag=0x00; //将读取标志位清零,后续如果有相同的地址,便不在进行判断了 } break; //找到设备动作对应的群地址了 ,直接退出 } } break; #if RS485_LED_Flag case DEV_RS485_PWM: //调光设备类型 for(j = 0;j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { if(0x00!=dimm_type[j].DimmReadFlag) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevActionInfo->DevActionOutput[i].DevActionOutAddr); //拷贝所有共有数据 if(NULL != BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr) { if(DEV_STATE_CLOSE == BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr(DevActionInfo->DevActionOutput[i].DevActionOutAddr, SceneType, dimm_type[j].DimmReadFlag, LED_OUT_CH_MAX, dimm_type[j].DimmReadState)) { SceneState = DEV_STATE_CLOSE; } } dimm_type[j].DimmReadFlag = 0x00; //将读取标志位清零,后续如果有相同的地址,便不在进行判断了 } break; //找到设备动作对应的群地址了 ,直接退出 } } break; #endif } } } for(i = 0;i < DevActionInfo->DevCtrlNum; i++) { //判断动作无延时,且动作对应的设备地址非空 if( (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00) && (DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00 ) ) { switch( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType ) { case Dev_Host_LVoutput: case DEV_RS485_SWT: case Dev_Host_Service: case Dev_Scene_Restore: if(DevActionInfo->DevActionCond.SceneExcute != ACTION_SCENE_SLEEP) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); //读取设备公共信息 if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; if( (DevCtrlWay == DEV_CTRLWAY_OPEN) || (DevCtrlWay == DEV_CTRLWAY_CLOSE) || (DevCtrlWay == DEV_CTRLWAY_STOP) ) { if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != DevCtrlWay) { SceneState = DEV_STATE_CLOSE; break; } } } } break; #if RS485_PB20_Relay_Flag case Dev_Rs485_PB20_Relay: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; if( (DevCtrlWay == DEV_CTRLWAY_OPEN) || (DevCtrlWay == DEV_CTRLWAY_CLOSE) || (DevCtrlWay == DEV_CTRLWAY_STOP) ) { if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != DevCtrlWay) { SceneState = DEV_STATE_CLOSE; break; } } } break; #endif case Dev_NodeCurtain: //虚拟设备 - 窗帘 case DEV_RS485_CURTAIN: //RS485设备 - 窗帘 if(DevActionInfo->DevActionCond.SceneExcute != ACTION_SCENE_SLEEP) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; if( (DevCtrlWay == DEV_CTRLWAY_OPEN) \ || (DevCtrlWay == DEV_CTRLWAY_CLOSE) \ || (DevCtrlWay == DEV_CTRLWAY_STOP) \ || (DevCtrlWay == 0x15) \ || (DevCtrlWay == 0x16) ) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != DevCtrlWay) { SceneState = DEV_STATE_CLOSE; break; } }else if( (DevCtrlWay == CFG_Dev_CtrlWay_Is_TOGGLE) || (DevCtrlWay == 0x05) ) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != DEV_CTRLWAY_STOP) { SceneState = DEV_STATE_CLOSE; break; } } } } break; #if Dev_Nor_ColorTemp case Dev_Nor_ColorTemp: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; DevCtrlCont = ((DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)>>8)&0x00ff; if(DevCtrlWay == DEV_CTRLWAY_OPEN) { DevCtrlCont |= 0x80; if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != DevCtrlCont ) { SceneState = DEV_STATE_CLOSE; break; } }else if(DevCtrlWay == DEV_CTRLWAY_CLOSE) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != (DevCtrlCont & 0x80) ) { SceneState = DEV_STATE_CLOSE; break; } } } break; #endif case DEV_C5MUSIC_Type: if(DevActionInfo->DevActionCond.SceneExcute != ACTION_SCENE_SLEEP) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { DEV_MUSIC_CTRLSTATE DevMusicCtrlState; BLV_Music_CtrlState_Get(&DevMusicCtrlState,DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); if(DevMusicCtrlState.DevMusicCtrlWay.CtrlDirect == 0x00) //疑问点 - 不太清楚这个 { DevCtrlWay = DevMusicCtrlState.DevMusicCtrlWay.CtrlDir; if( (DevCtrlWay == DEV_CTRLWAY_OPEN) \ || (DevCtrlWay == DEV_CTRLWAY_CLOSE) ) { if(DevCtrlWay != BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop)) { SceneState = DEV_STATE_CLOSE; break; } } } } } break; #if Dev_Nor_Carbon_Flag case DEV_Carbon_Saved: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); //拷贝所有共有数据 if(NULL != BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get) //非空 { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; //低字节 DevCtrlCont = ((DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)>>8)&0x00ff; //高字节 if(0x01 == DevCtrlWay) //且控制节能状态 开和关 { if(DevCtrlCont != BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop)) { SceneState = DEV_STATE_CLOSE; //只要有一个状态不满足就跳出 此时场景状态为关 break; //跳出switch循环 } } } break; #endif } } if(SceneState == DEV_STATE_CLOSE) break; } if(DevActionInfo->DevActionState.SceneState != SceneState) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit," 当前场景名:%d 场景状态:%d", DevActionInfo->DevActionCore.ActionNo, SceneState); DevActionInfo->DevActionState.SceneState = SceneState; //1开 2关 0未初始化 } } /******************************************************************************* * Function Name : Sleep_State_Get * Description : 睡眠模式状态获取 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void Sleep_State_Get(DEV_ACTION_INFO *DevActionInfo) { uint8_t i;//,j; uint32_t DevAddrOut = 0x00; //设备地址局部变量 Device_Public_Information_G BUS_Public; //共用 uint8_t DevCtrlWay = 0x00; //执行方式 uint8_t DevCtrlCont = 0x00; //执行内容 uint8_t SceneState = DEV_STATE_OPEN; EXPAND_TYPE_G expand_type[Action_Group_Ctrl_Num]={0}; DIMM_TYPE_G dimm_type[Action_Group_Ctrl_Num]={0}; Expand_And_Dimm_Action_Get(DevActionInfo,expand_type,dimm_type,0x01); for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { DevAddrOut = DevActionInfo->DevActionOutput[i].DevActionOutAddr; if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_HVout: //继电器 SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) == DEV_STATE_OPEN) { SceneState = DEV_STATE_CLOSE; //只赋值关 break; } } break; #if RS485_LED_Flag case DEV_RS485_PWM: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != 0x00) { SceneState = DEV_STATE_CLOSE; break; } } break; #endif } } } for(i = 0; i < DevActionInfo->DevCtrlNum; i++ ) { if( (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00) && (DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) ) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Rs485_PB20_Relay: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; if( (DevCtrlWay == DEV_CTRLWAY_OPEN) || (DevCtrlWay == DEV_CTRLWAY_CLOSE) || (DevCtrlWay == DEV_CTRLWAY_STOP) ) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != DevCtrlWay ) { SceneState = DEV_STATE_CLOSE; break; } } } break; case Dev_Rs485_PB20: case Dev_Rs485_PB20_LD: case Dev_Rs485_PB20_LS: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00 ) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState & 0x00ff); DevCtrlCont = ((DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState) >> 8) & 0x00ff; //待完成 - } break; case DEV_Virtual_ColorTemp: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; DevCtrlCont = ((DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)>>8)&0x00ff; if( (DevCtrlWay == DEV_CTRLWAY_OPEN) || (DevCtrlWay == DEV_CTRLWAY_CLOSE) ) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) != DevCtrlCont ) { SceneState = DEV_STATE_CLOSE; break; } } } break; } } if(DEV_STATE_CLOSE == SceneState) break; } if(DevActionInfo->DevActionState.SceneState != SceneState) { DevActionInfo->DevActionState.SceneState = SceneState; } } /******************************************************************************* * Function Name : MainSwitch_Expand_State_Get * Description : 总开关扩展场景状态得到函数 * 注意:总开关场景,仅判断开的灯,有一个灯开,场景状态为开。全关才算关 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void MainSwitch_Expand_State_Get(DEV_ACTION_INFO *DevActionInfo) { uint8_t i = 0,j = 0; uint32_t DevAddrOut = 0x00; Device_Public_Information_G BUS_Public; //共用 uint8_t DevCtrlWay = 0x00; //执行方式 uint8_t DevCtrlCont = 0x00; //执行内容 uint8_t SceneState = DEV_STATE_CLOSE; EXPAND_TYPE_G expand_type[Action_Group_Ctrl_Num]={0}; DIMM_TYPE_G dimm_type[Action_Group_Ctrl_Num]={0}; Expand_And_Dimm_Action_Get(DevActionInfo,expand_type,dimm_type,0x01); for(i = 0;i < DevActionInfo->DevCtrlNum; i++) { if( DevActionInfo->DevActionOutput[i].DevActionOutAddr != DevAddrOut ) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_HVout: //继电器 for(j = 0;j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { if(expand_type[j].ExpandReadFlag != 0x00) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr != 0x00) { if(BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr(DevAddrOut, DEV_STATE_CLOSE, expand_type[j].ExpandReadFlag, HVoutNumMAX, expand_type[j].ExpandReadState) == DEV_STATE_OPEN) { SceneState = DEV_STATE_OPEN; } } expand_type[j].ExpandReadFlag=0x00; //清楚控制标志位 } break; } } break; #if RS485_LED_Flag case DEV_RS485_PWM: for(j = 0;j < Action_Group_Ctrl_Num; j++) { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == dimm_type[j].Addr ) { if( dimm_type[j].DimmReadFlag != 0x00 ) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr != 0x00 ) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_Group_State_Get_ptr(DevAddrOut, DEV_STATE_CLOSE, dimm_type[j].DimmReadFlag, LED_OUT_CH_MAX, dimm_type[j].DimmReadState) == DEV_STATE_OPEN ) { SceneState = DEV_STATE_OPEN; } } dimm_type[j].DimmReadFlag=0x00; //清楚控制标志位 } break; } } break; #endif } } } for( i = 0; i < DevActionInfo->DevCtrlNum; i++ ) { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00 ) { if( DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00 ) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case DEV_RS485_STRIP: case Dev_Rs485_PB20: case DEV_Virtual_ColorTemp: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00 ) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; DevCtrlCont = ((DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)>>8)&0x00ff; if(DevCtrlWay == DEV_STATE_OPEN) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) == DevCtrlCont ) { SceneState = DEV_STATE_OPEN; break; } } } break; case Dev_Scene_Restore: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get != 0x00 ) { DevCtrlWay = (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState)&0x00ff; if( (DevCtrlWay == DEV_STATE_OPEN) || (DevCtrlWay == DEV_STATE_CLOSE) ) { if( BUS_Public.DevFunInfo.Dev_Output_Loop_State_Get(DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop) == DevCtrlWay ) { SceneState = DEV_STATE_OPEN; break; } } } break; } } if(SceneState == DEV_STATE_OPEN) break; //跳出for循环 } } DevActionInfo->DevActionState.SceneState = SceneState; } /******************************************************************************* * Function Name : DevAction_State_Get * Description : 设备动作状态得到 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_State_Get(DEV_ACTION_INFO *DevActionInfo) { switch(DevActionInfo->DevActionCond.SceneExcute) //根据动作当前的执行方式 { case ACTION_SCENE_SLEEP: //设备执行方式 - 睡眠模式 if(DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01) //夜灯存在 { if(DevActionGlobal.DevActionU64Cond.NeightState == NightModeStart) //进入起夜场景 赋值给全局动作变量 { DevActionInfo->DevActionState.SceneState = DEV_STATE_OPEN; //起夜场景 - 开 if( DevActionGlobal.SleepLight_State != 0x01 ) { DevActionGlobal.SleepMode_State = 0x01; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"进入睡眠场景 5"); } } if(DevActionGlobal.CardInFlag == 0x01) //入住服务标志位开启 - 清除睡眠标志位 { Sleep_State_Get(DevActionInfo); if(DevActionInfo->DevActionState.SceneState == DEV_STATE_CLOSE) //当前场景 夜灯存在的话,场景为关时,关闭睡眠模式 - 疑问点 { DevActionGlobal.CardInFlag = 0x00; DevActionGlobal.SleepMode_State = 0x00; DevActionGlobal.DevActionU64Cond.NeightState = NightModeClose; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景 -5"); } } break; //带夜灯 直接跳出 }else { Expand_State_Get(DevActionInfo); if(DevActionInfo->DevActionState.SceneState == DEV_STATE_CLOSE) { if(DevActionGlobal.CardInFlag == 0x01) { DevActionGlobal.CardInFlag = 0x00; DevActionGlobal.SleepMode_State = 0x00; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景 -6"); } } } break; case ACTION_SCENE_ONE: //设备执行方式 - 不可关闭 case ACTION_SCENE_TWO: //设备执行方式 - 可关闭 case ACTION_SCENE_HELPSLEEP: //设备执行方式 - 助眠场景 Expand_State_Get(DevActionInfo); break; case ACTION_SCENE_MAINSWITCH: //设备执行方式 - 总开关 MainSwitch_Expand_State_Get(DevActionInfo); //场景状态得到 break; } if( DevActionGlobal.DevActionU64Cond.NeightState != DevActionGlobal.Last_NeightState ) { DevActionGlobal.Last_NeightState = DevActionGlobal.DevActionU64Cond.NeightState; } } /******************************************************************************* * Function Name : DevDly_InfoSet * Description : 延时动作执行,信息直接赋值 * Input : DevDlyAddr : 延时链表的节点地址 DlyExcuteFlag :延时执行标志 DevOutputType :执行方式 DevDelayTime :执行时间 DlyBlinkFlag :闪烁标志位 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevDly_InfoSet( uint32_t DevDlyAddr, uint8_t DlyExcuteFlag, uint16_t DevOutputType, Dev_Dly_Value DevDelayTime, uint8_t DlyBlinkFlag) { Struct_Dev_Dly DevDlyInfo; Dev_Dly_Value DevDlyValue; uint32_t DlyExcuteTime = 0x00; if( DevDlyAddr == 0x00 ) return ; DevDlyValue.DelayCont = DevDelayTime.DelayCont; DevDlyValue.DelayWeight = DevDelayTime.DelayWeight; switch(DevDlyValue.DelayWeight) { case 0x00: //单位为0,可能准备清延时 DlyExcuteTime = 0x00; break; case DELAY_TIME_MS: //0x01 //毫秒 DlyExcuteTime = SysTick_1ms + DevDlyValue.DelayCont; break; case DELAY_TIME_S: //0x02 //秒 DlyExcuteTime = SysTick_1ms + DevDlyValue.DelayCont*1000; break; case DELAY_TIME_MIN: //0x03 //分钟 DlyExcuteTime = SysTick_1ms + DevDlyValue.DelayCont*1000*60; break; case DELAY_TIME_HOUR: //0x04 //小时 DlyExcuteTime = SysTick_1ms + DevDlyValue.DelayCont*1000*60*60; break; default: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"延时单位为无效:", DevDlyValue.DelayWeight); return; //其他情况直接返回 } SRAM_DMA_Read_Buff((uint8_t *)&DevDlyInfo, sizeof(Struct_Dev_Dly), DevDlyAddr); //把状态读取出来 if( ( DevDlyInfo.DlyExcuteTime != DlyExcuteTime ) || ( DevDlyInfo.DlyExcuteFlag != DlyExcuteFlag ) || ( DevDlyInfo.DevOutputType != DevOutputType ) || ( DevDlyInfo.DlyBlinkFlag != DlyBlinkFlag ) || ( DevDlyInfo.DlyBlinkTime.DelayCont != DevDelayTime.DelayCont ) || ( DevDlyInfo.DlyBlinkTime.DelayWeight != DevDelayTime.DelayWeight ) ) { DevDlyInfo.DlyExcuteFlag = DlyExcuteFlag; DevDlyInfo.DevOutputType = DevOutputType; switch(DlyBlinkFlag) { case 0x01: //开启闪烁 DevDlyInfo.DlyBlinkFlag = DlyBlinkFlag; DevDlyInfo.DlyExcuteTime = DlyExcuteTime; break; case 0x02: //关闭闪烁 不重新赋值倒计时时间 if(0x01 == DevDlyInfo.DlyBlinkFlag) //之前是开启闪烁状态 { DevDlyInfo.DlyBlinkFlag = DlyBlinkFlag; } break; default: DevDlyInfo.DlyBlinkFlag = DlyBlinkFlag; DevDlyInfo.DlyExcuteTime = DlyExcuteTime; break; } DevDlyInfo.DlyBlinkTime.DelayCont = DevDelayTime.DelayCont; DevDlyInfo.DlyBlinkTime.DelayWeight = DevDelayTime.DelayWeight; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"延时节点赋值,节点地址:%08X 执行标志:%d 时间:%02x%02x, 执行方式:%04X 闪烁标志:%d", \ DevDlyAddr, DlyExcuteFlag, \ DevDlyValue.DelayCont, \ DevDlyValue.DelayWeight, \ DevOutputType, \ DevDlyInfo.DlyBlinkFlag); SRAM_DMA_Write_Buff((uint8_t *)&DevDlyInfo, sizeof(Struct_Dev_Dly), DevDlyAddr); //把状态读取出来 } } /******************************************************************************* * Function Name : DevDlyAddr_Get * Description : 根据设备信息和回路,来得到延时节点 * Input : DevDlyAddr : 延时链表的节点地址 DevOutputLoop :延时输出回路 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) uint32_t DevDlyAddr_Get(uint32_t DevDlyAddr, uint16_t DevOutputLoop) { uint16_t i = 0x00; uint32_t list_addr = 0x00; Struct_Dev_Dly_Core DevDlyCore; for(i = 0; i < DevActionGlobal.DevDlyNum; i++) { list_addr = SRAM_DevDly_List_Start_Addr + i * DevDlyStructLen; SRAM_DMA_Read_Buff((uint8_t *)&DevDlyCore, sizeof(Struct_Dev_Dly_Core), list_addr); if( (DevDlyCore.DevDlyAddr == DevDlyAddr) && (DevDlyCore.DevOutputLoop == DevOutputLoop) ) { return list_addr; } } return 0x00; } /******************************************************************************* * Function Name : Add_DevDly_To_List * Description : 将延时设备信息添加到链表 * 将需要延时的节点添加到链表,如果是新节点,就返回新的地址,如果是旧节点,就返回旧地址 * Input : DevType : 设备类型 DevDlyAddr :设备节点地址 DevOutputLoop :回路地址 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) uint32_t Add_DevDly_To_List(uint8_t DevType, uint32_t DevDlyAddr, uint16_t DevOutputLoop) { uint32_t list_addr = 0x00; Struct_Dev_Dly_Core DevDlyCore; if(DevActionGlobal.DevActionNum >= DevDlyNumMax) //延时设备总数超过范围就返回 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"延时设备添加超过范围 延时设备上限: %d", DevDlyNumMax); return 0x00; } list_addr = DevDlyAddr_Get(DevDlyAddr, DevOutputLoop); //遍历当前所有延时节点 if(list_addr != 0x00) return list_addr; //直接将地址返回 DevDlyCore.DevType = DevType; DevDlyCore.DevDlyAddr = DevDlyAddr; DevDlyCore.DevOutputLoop = DevOutputLoop; //填充数据 list_addr = SRAM_DevDly_List_Start_Addr + DevActionGlobal.DevDlyNum*DevDlyStructLen; SRAM_DMA_Write_Buff((uint8_t *)&DevDlyCore, sizeof(Struct_Dev_Dly_Core), list_addr); DevActionGlobal.DevDlyNum++; //延时节点计数增加 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"延时设备添加成功当前延时节点地址:%08X 当前延时设备计数:%d 延时设备地址: %08X 延时设备回路:%d", list_addr , DevActionGlobal.DevDlyNum, DevDlyCore.DevDlyAddr, DevDlyCore.DevOutputLoop); /*遍历当前所有的延时设备,存在过的,就不添加,不存在的就往后添加*/ return list_addr; //返回有效的地址 } /******************************************************************************* * Function Name : DevAddrCtr * Description : 添加设备控制 *******************************************************************************/ __attribute__((section(".non_0_wait"))) uint8_t DevAddrCtr(DEV_ACTION_INFO *DevActionInfo, uint8_t *p, uint8_t DataLen) { uint8_t Ret = 0x02; //默认不存在 uint32_t DevAddrOut = 0x00; //设备地址局部变量 Dev_Action_Output DevActionOutput; memset((uint8_t *)&DevActionOutput, 0x00, sizeof(Dev_Action_Output)); switch(DataLen) { case DevCtrlLen: case DevCtrlDlyLenAddr: memcpy((uint8_t *)&DevActionOutput, p, DataLen); break; default: return Ret; } switch(DataLen) { case DevCtrlLen: //6字节 需要自己查设备 DevAddrOut = Find_AllDevice_List_Information(DevActionOutput.DevActionOutCfg.DevType, DevActionOutput.DevActionOutCfg.DevAddr); break; case DevCtrlDlyLenAddr: //带延时,带地址控制,带延时设备地址 DevAddrOut = DevActionOutput.DevActionOutAddr; break; } if(DevAddrOut == 0x00) return Ret; Ret = 0x01; if( DevActionOutput.DevActionOutCfg.DevDlyValue.DelayCont == 0x00 ) { Device_Public_Information_G BUS_Public; DevDly_InfoSet( DevActionOutput.DevDlyAddr, 0x00, DevActionOutput.DevActionOutCfg.DevCtrlState, DevActionOutput.DevActionOutCfg.DevDlyValue, 0x00); SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); switch(DevActionOutput.DevActionOutCfg.DevType) { case DEV_RS485_SWT: case DEV_RS485_WxLock: case Dev_Host_Service: case Dev_Host_HVout: case Dev_Host_LVoutput: case Dev_NodeCurtain: case DEV_RS485_CURTAIN: case DEV_RS485_IR_SEND: case DEV_RS485_TEMP: case DEV_RS485_FreshAir: case DEV_RS485_HEATER: case Dev_Energy_Monitor: if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { if( (DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionOutput.DevActionOutCfg.DevType, DevAddrOut, DevActionOutput.DevActionOutCfg.DevOutputLoop, DevActionOutput.DevActionOutCfg.DevCtrlState); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionOutput.DevActionOutCfg.DevOutputLoop, DevActionOutput.DevActionOutCfg.DevCtrlState); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionOutput.DevActionOutCfg.DevOutputLoop, DevActionOutput.DevActionOutCfg.DevCtrlState); } } break; case DEV_RS485_PWM: case DEV_RS485_STRIP: case Dev_Rs485_PB20: case Dev_Rs485_PB20_LD: case Dev_Rs485_PB20_LS: case Dev_Rs485_PB20_Relay: case DEV_Virtual_ColorTemp: case Dev_Virtual_GlobalSet: if( BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL ) { if( (DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionOutput.DevActionOutCfg.DevType, DevAddrOut, DevActionOutput.DevActionOutCfg.DevOutputLoop, DevActionOutput.DevActionOutCfg.DevCtrlState); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionOutput.DevActionOutCfg.DevOutputLoop, DevActionOutput.DevActionOutCfg.DevCtrlState); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionOutput.DevActionOutCfg.DevOutputLoop, DevActionOutput.DevActionOutCfg.DevCtrlState); } } break; } }else if( (DevActionOutput.DevActionOutCfg.DevDlyValue.DelayCont != 0x00) && (DevActionOutput.DevDlyAddr != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备延时设备执行置位,设备类型:%d %d路 内容: %d,时间:%d单位:%d", DevActionOutput.DevActionOutCfg.DevType, DevActionOutput.DevActionOutCfg.DevOutputLoop, DevActionOutput.DevActionOutCfg.DevCtrlState, DevActionOutput.DevActionOutCfg.DevDlyValue.DelayCont, DevActionOutput.DevActionOutCfg.DevDlyValue.DelayWeight); DevDly_InfoSet( DevActionOutput.DevDlyAddr, 0x01, DevActionOutput.DevActionOutCfg.DevCtrlState, DevActionOutput.DevActionOutCfg.DevDlyValue, 0x00); } return Ret; } /******************************************************************************* * Function Name : DevActionCtrl * Description : 设备控制专线 *******************************************************************************/ __attribute__((section(".non_0_wait"))) uint8_t DevActionCtrl(uint8_t *p, uint8_t DataLen) { uint8_t Ret = 0x02; //默认失败 uint16_t SceneCtrlNo = 0x00; //控制的场景号 uint16_t SceneCtrlState = 0x00; if(DevCtrlLen != DataLen) return Ret; switch(p[0]) { case Dev_Host_Invalid: DevActionGlobal.ServerCtrl = 0x01; SceneCtrlNo = p[3]; SceneCtrlNo <<= 0x08; SceneCtrlNo |= p[2]; SceneCtrlState = p[5]; SceneCtrlState <<= 0x08; SceneCtrlState |= p[4]; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制场景 场景号:%d", SceneCtrlNo); if(SceneCtrlNo == DevActionGlobal.SleepActionNo) p[4] = 0x02; DevAction_No_Ctrl(SceneCtrlNo, 0x01, SceneCtrlState); break; default: Ret = DevAddrCtr(NULL, p, DataLen); break; } return Ret; } /******************************************************************************* * Function Name : Ele_Ctrl_OpenClose * Description : 单纯控制取电服务取电状态 * Input : Ctrl : 0x01-开,0x00-关 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void Ele_Ctrl_OpenClose(uint8_t Ctrl) { uint8_t DataBuf[6]; DataBuf[0] = Dev_Host_Service; DataBuf[1] = 0x00; DataBuf[2] = 0x00; DataBuf[3] = 0x00; DataBuf[4] = Ctrl; DataBuf[5] = 0x00; DevAddrCtr(NULL, DataBuf, 0x06); //插卡取电控制 } /******************************************************************************* * Function Name : DevAction_ExpandCtrl * Description : 扩展场景状态控制函数 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_ExpandCtrl(DEV_ACTION_INFO *DevActionInfo) { uint8_t i = 0,j = 0; uint32_t DevAddrOut = 0x00; //设备地址局部变量 Device_Public_Information_G BUS_Public; EXPAND_TYPE_G expand_type[Action_Group_Ctrl_Num]={0}; DIMM_TYPE_G dimm_type[Action_Group_Ctrl_Num]={0}; Expand_And_Dimm_Action_Get(DevActionInfo,expand_type,dimm_type,0x01); for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != DevAddrOut) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_HVout: for(j = 0; j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { if( expand_type[j].ExpandReadFlag != 0x00 ) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != 0x00 ) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, expand_type[j].ExpandReadFlag, HVoutNumMAX, expand_type[j].ExpandReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"继电器状态群控控制开始,回路标志:%08X 场景名:%s ", expand_type[j].ExpandReadFlag, DevActionInfo->DevActionCore.DevActionName); } expand_type[j].ExpandReadFlag=0x00; } break; //处理完成,直接退出当前循环 } } break; #if RS485_LED_Flag case DEV_RS485_PWM: for(j = 0; j < Action_Group_Ctrl_Num; j++ ) { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == dimm_type[j].Addr ) { if( dimm_type[j].DimmReadFlag != 0x00 ) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != 0x00 ) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, dimm_type[j].DimmReadFlag, LED_OUT_CH_MAX, dimm_type[j].DimmReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"PWM调光状态群控控制开始地址:%d,回路标志:%08X 场景名:%s ", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr, dimm_type[j].DimmReadFlag, DevActionInfo->DevActionCore.DevActionName); } dimm_type[j].DimmReadFlag = 0x00; } break; //处理完成,直接退出当前循环 } } break; #endif } } } for(i = 0; i < DevActionInfo->DevCtrlNum ; i++ ) { if( DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00 ) { //清延时执行标志位 DevDly_InfoSet( DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case DEV_RS485_SWT: case DEV_RS485_WxLock: case Dev_Host_Service: case Dev_Host_LVoutput: case Dev_NodeCurtain: case DEV_RS485_IR_SEND: case DEV_RS485_TEMP: case DEV_RS485_CURTAIN: case DEV_RS485_FreshAir: case DEV_RS485_HEATER: case Dev_Rs485_PB20: case Dev_Rs485_PB20_LD: case Dev_Rs485_PB20_LS: case Dev_Rs485_PB20_Relay: case DEV_Virtual_NoCard: case DEV_Virtual_Card: case Dev_485_BLE_Music: case DEV_Carbon_Saved: case Dev_Scene_Restore: case Dev_Energy_Monitor: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { if( (DevActionInfo != NULL) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); //服务信息状态赋值 BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); } } break; case DEV_RS485_STRIP: case DEV_Virtual_ColorTemp: case Dev_Virtual_GlobalSet: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { if( (DevActionInfo != NULL) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); //服务信息状态赋值 BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); } } break; case DEV_RS485_MUSIC: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { if( ( DevActionInfo != NULL ) && ( CondIsPass == CondJudge(DevActionInfo->DevActionCond.DevActionU64Cond.WarningState, DevActionGlobal.DevActionU64Cond.WarningState) ) ) { DEV_MUSIC_CTRLSTATE DevMusicCtrlState; //背景音乐控制状态 BLV_Music_CtrlState_Get(&DevMusicCtrlState,DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); switch(DevMusicCtrlState.DevMusicCtrlWay.CtrlDirect) { case 0x03: //场景开播放 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备执行背景音乐指定文件夹开播放,回路:%d 状态: %04X",DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); //执行开场景指定播放 break; case 0x04: //场景关播放 break; default: //其他情况 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备执行背景音乐开关机模式控制,地址:%d 回路:%d状态: %04X",BUS_Public.addr, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); //执行开场景指定播放 break; } } } break; } } else if( ( 0x00 != DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont ) && ( 0x00 != DevActionInfo->DevActionOutput[i].DevDlyAddr ) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备延时设备执行置位,设备类型:%d %d路 内容: %d,时间:%d单位:%d", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayWeight); DevDly_InfoSet( DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x01, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); } } } } /******************************************************************************* * Function Name : DevAction_ExpandLightOpen * Description : 扩展灯光类设备控制函数 或者场景 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_ExpandLightOpen(DEV_ACTION_INFO *DevActionInfo) { uint8_t i = 0,j = 0; uint32_t DevAddrOut = 0; Device_Public_Information_G BUS_Public; EXPAND_TYPE_G expand_type[Action_Group_Ctrl_Num]={0}; DIMM_TYPE_G dimm_type[Action_Group_Ctrl_Num]={0}; Expand_And_Dimm_Action_Get(DevActionInfo,expand_type,dimm_type,0x01); for(i = 0; i < DevActionInfo->DevCtrlNum; i++ ) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_HVout: for(j = 0; j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { if( expand_type[j].ExpandReadFlag != 0x00 ) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != NULL ) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( 0x00, 0x00, DevAddrOut, expand_type[j].ExpandReadFlag, HVoutNumMAX, expand_type[j].ExpandReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"继电器群控控制,回路标志:%08X 场景名:%s ", expand_type[j].ExpandReadFlag, DevActionInfo->DevActionCore.DevActionName); } expand_type[j].ExpandReadFlag=0x00; } break; } } break; #if RS485_LED_Flag case DEV_RS485_PWM: for(j = 0; j < Action_Group_Ctrl_Num; j++) { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == dimm_type[j].Addr ) { if( dimm_type[j].DimmReadFlag != 0x00 ) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != NULL) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( 0x00, 0x00, DevAddrOut, dimm_type[j].DimmReadFlag, LED_OUT_CH_MAX, dimm_type[j].DimmReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"PWM调光群控控制开始地址:%d,回路标志:%08X 场景名:%s ", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr, dimm_type[j].DimmReadFlag, DevActionInfo->DevActionCore.DevActionName); } dimm_type[j].DimmReadFlag = 0x00; } } } break; #endif } } } for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { if( DevActionInfo->DevActionOutput[i].DevActionOutAddr == 0x00 ) { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00 ) { DevDly_InfoSet(DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_LVoutput: case Dev_Rs485_PB20: case Dev_Rs485_PB20_LD: case Dev_Rs485_PB20_LS: case Dev_Rs485_PB20_Relay: case Dev_Scene_Restore: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { if( (DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); }else{ BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); } } break; case DEV_RS485_STRIP: case DEV_Virtual_ColorTemp: case Dev_Virtual_GlobalSet: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL ) { if( (DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); } } break; } }else if( (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont != 0x00) && (DevActionInfo->DevActionOutput[i].DevDlyAddr != 0x00) ) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_HVout: case Dev_Host_LVoutput: case DEV_RS485_PWM: case DEV_RS485_STRIP: case DEV_Virtual_ColorTemp: case Dev_Scene_Restore: case Dev_Virtual_GlobalSet: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备延时设备执行置位,设备类型:%d %d路 内容: %d,时间:%d单位:%d", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayWeight); DevDly_InfoSet(DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x01, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); break; } } } } } /******************************************************************************* * Function Name : DevAction_ExpandLightClose * Description : 扩展场景状态控制函数 立即执行的设备才执行 所有设备都关闭 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_ExpandLightClose(DEV_ACTION_INFO *DevActionInfo) { uint8_t i = 0x00,j = 0x00; uint32_t DevAddrOut = 0x00; Device_Public_Information_G BUS_Public; EXPAND_TYPE_G expand_type[Action_Group_Ctrl_Num]={0}; DIMM_TYPE_G dimm_type[Action_Group_Ctrl_Num]={0}; Expand_And_Dimm_Action_Get(DevActionInfo,expand_type,dimm_type,0x00); for(i = 0; i < DevActionInfo->DevCtrlNum; i++ ) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { switch( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType ) { case Dev_Host_HVout: for(j = 0; j < Action_Group_Ctrl_Num ; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { if(expand_type[j].ExpandReadFlag != 0x00) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != NULL) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( 0x00, 0x00, DevAddrOut, expand_type[j].ExpandReadFlag, HVoutNumMAX, expand_type[j].ExpandReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"继电器状态群控控制开始,回路标志:%08X 场景名:%s ", expand_type[j].ExpandReadFlag, DevActionInfo->DevActionCore.DevActionName); } expand_type[j].ExpandReadFlag=0x00; } break; //执行完成,直接退出 } } break; #if RS485_LED_Flag case DEV_RS485_PWM: for(j = 0;j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == dimm_type[j].Addr) { if(dimm_type[j].DimmReadFlag != 0x00) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != NULL) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( 0x00, 0x00, DevAddrOut, dimm_type[j].DimmReadFlag, LED_OUT_CH_MAX, dimm_type[j].DimmReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"PWM调光状态群控控制开始地址:%d,回路标志:%08X 场景名:%s ", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr, dimm_type[j].DimmReadFlag, DevActionInfo->DevActionCore.DevActionName); } dimm_type[j].DimmReadFlag = 0x00; } break; } } break; #endif } } } for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { if( DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00 ) { if( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00 ) { DevDly_InfoSet(DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_LVoutput: case DEV_RS485_STRIP: case Dev_Rs485_PB20_Relay: case DEV_Virtual_ColorTemp: case Dev_Scene_Restore: case Dev_Virtual_GlobalSet: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL ) { if( (DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_CLOSE); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_CLOSE); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_CLOSE); } } break; case Dev_Rs485_PB20: case Dev_Rs485_PB20_LD: case Dev_Rs485_PB20_LS: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL ) { if( (DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, 0x0012); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, 0x0012); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, 0x0012); } } break; } }else if( (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont != 0x00) && (DevActionInfo->DevActionOutput[i].DevDlyAddr != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备延时设备执行置位,设备类型:%d %d路 内容: %d,时间:%d单位:%d", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayWeight); DevDly_InfoSet(DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x01, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); } } } } /******************************************************************************* * Function Name : DevAction_ExpandClose * Description : 扩展场景状态控制函数 立即执行的设备才执行 所有设备都关闭 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_ExpandClose(DEV_ACTION_INFO *DevActionInfo, uint8_t ModeCtrl) { uint8_t i = 0x00,j = 0x00; uint32_t DevAddrOut = 0x00; Device_Public_Information_G BUS_Public; EXPAND_TYPE_G expand_type[Action_Group_Ctrl_Num]={0}; DIMM_TYPE_G dimm_type[Action_Group_Ctrl_Num]={0}; for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case Dev_Host_HVout: for(j = 0; j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == expand_type[j].Addr) { if(expand_type[j].ExpandReadFlag != 0x00) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != NULL) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( 0x00, 0x00, DevAddrOut, expand_type[j].ExpandReadFlag, HVoutNumMAX, expand_type[j].ExpandReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"继电器状态群控控制开始,回路标志:%08X 场景名:%s ", expand_type[j].ExpandReadFlag, DevActionInfo->DevActionCore.DevActionName); } expand_type[j].ExpandReadFlag=0x00; } break; //执行完成,直接退出 } } break; #if RS485_LED_Flag case DEV_RS485_PWM: for(j = 0; j < Action_Group_Ctrl_Num; j++) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr == dimm_type[j].Addr) { if(dimm_type[j].DimmReadFlag != 0x00) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl != NULL) { BUS_Public.DevFunInfo.Dev_Output_Group_Ctrl( 0x00, 0x00, DevAddrOut, dimm_type[j].DimmReadFlag, LED_OUT_CH_MAX, dimm_type[j].DimmReadState); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"PWM调光状态群控控制开始地址:%d,回路标志:%08X 场景名:%s ", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr, dimm_type[j].DimmReadFlag, DevActionInfo->DevActionCore.DevActionName); } dimm_type[j].DimmReadFlag = 0x00; } break; } } break; #endif } } } for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont == 0x00) { DevDly_InfoSet(DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case DEV_RS485_SWT: case Dev_Host_LVoutput: case DEV_RS485_STRIP: case Dev_Rs485_PB20_Relay: case DEV_Virtual_ColorTemp: case Dev_Scene_Restore: case Dev_Virtual_GlobalSet: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { if( (DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_CLOSE); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_CLOSE); }else { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_CLOSE); } } break; case Dev_Rs485_PB20: case Dev_Rs485_PB20_LD: case Dev_Rs485_PB20_LS: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) //非空 { if((DevActionInfo != 0x00) && (DevActionInfo->DevActionState.DevAddrIn != 0x00)) // { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入设备地址:%04X 设备类型:%d 地址:%04X %d路 控制状态: %04X", DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, 0x0012); BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, 0x0012); }else{ BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, 0x0012); } } break; case Dev_NodeCurtain: //窗帘开取反为窗帘停 窗帘关取反为窗帘停 窗帘停取反为窗帘开或关 SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); //拷贝所有共有数据 if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { switch(ModeCtrl) { case NOR_MODE_CTRL: switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState & 0x00FF) { case DEV_CTRLWAY_OPEN: //开 case DEV_CTRLWAY_CLOSE: //关 case CFG_Dev_CtrlWay_Is_TOGGLE: //互切 BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_STOP); break; case 0x15: //延时控制开 case 0x16: //延时控制关 - 场景可关闭时,延时控制关闭状态为0x17 BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, 0x17); break; case DEV_CTRLWAY_STOP: break; } break; case SLEEP_MODE_CTRL: BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); break; } } break; case DEV_RS485_CURTAIN: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if( BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL ) { switch(ModeCtrl) { case NOR_MODE_CTRL: //普通模式 窗帘控制 switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState & 0x00FF) { case DEV_CTRLWAY_OPEN: case DEV_CTRLWAY_CLOSE: case CFG_Dev_CtrlWay_Is_TOGGLE: case 0x05: BUS_Public.DevFunInfo.Dev_Output_Ctrl( DevActionInfo->DevActionState.DevAddrIn, DevActionInfo->DevActionInput.inAddr, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_STOP); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"485窗帘场景关闭控制 state:%4X",DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); break; case DEV_CTRLWAY_STOP: break; } break; case SLEEP_MODE_CTRL: //睡眠模式 窗帘控制 BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); break; } } break; case Dev_Host_Service: //睡眠控制服务信息 SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { switch(ModeCtrl) { case NOR_MODE_CTRL: //普通模式 服务信息控制 switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState) { case DEV_CTRLWAY_OPEN: case DEV_CTRLWAY_CLOSE: BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_CLOSE); break; } break; case SLEEP_MODE_CTRL: //睡眠模式 服务信息控制 BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevAddrOut, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState); break; } } break; } }else if( (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont != 0x00) && (DevActionInfo->DevActionOutput[i].DevDlyAddr != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备延时设备执行置位,设备类型:%d %d路 内容: %d,时间:%d单位:%d", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayWeight); DevDly_InfoSet(DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); } } } } /******************************************************************************* * Function Name : DevAction_Mode_Ctrl * Description : 场景模式控制 * Input : DevActionInfo : 动作场景信息 Mode :0x01-场景控制,0x02-灯光控制 SceneMode :NOR_MODE_CTRL 0x01 普通模式控制;SLEEP_MODE_CTRL 0x02 睡眠场景控制 CtrlState :控制状态 1-开,2-关 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_ExpandDlyClear(DEV_ACTION_INFO *DevActionInfo) { uint8_t i = 0; uint32_t DevAddrOut = 0x00; Device_Public_Information_G BUS_Public; for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { if(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType != Dev_Host_Invalid) { SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAddrOut); } if( (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont != 0x00) && (DevActionInfo->DevActionOutput[i].DevDlyAddr != 0x00) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"准备延时设备执行置位,设备类型:%d %d路 内容: %d,时间:%d单位:%d", DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayWeight); DevDly_InfoSet(DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); } } } } /******************************************************************************* * Function Name : DevAction_No_Get * Description : 根据场景编号得到动作的地址 * Input : DevActionInfo : 动作场景信息 Mode :0x01-场景控制,0x02-灯光控制 SceneMode :NOR_MODE_CTRL 0x01 普通模式控制;SLEEP_MODE_CTRL 0x02 睡眠场景控制 CtrlState :控制状态 1-开,2-关 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) uint32_t DevAction_No_Get(uint16_t DevActionNo) { uint16_t i = 0; uint32_t list_addr = 0; DEV_ACTION_INFO DevActionInfo; for(i = 0; i < DevActionGlobal.DevActionNum; i++ ) { list_addr = SRAM_DevAction_List_Start_Addr + i*SRAM_DevAction_List_Size; SRAM_DMA_Read_Buff((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO), list_addr); if(DevActionInfo.DevActionCore.ActionNo == DevActionNo) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"遍历所有动作,找到相应的场景编号:%d 场景名%s", DevActionNo, DevActionInfo.DevActionCore.DevActionName); return list_addr; //返回当前动作的地址 } } return 0x00; } /******************************************************************************* * Function Name : DevAction_Mode_Ctrl * Description : 场景模式控制 * Input : DevActionInfo : 动作场景信息 Mode :0x01-场景控制,0x02-灯光控制 SceneMode :NOR_MODE_CTRL 0x01 普通模式控制;SLEEP_MODE_CTRL 0x02 睡眠场景控制 CtrlState :控制状态 1-开,2-关 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_Mode_Ctrl( DEV_ACTION_INFO *DevActionInfo, uint8_t Mode, uint8_t SceneMode, uint16_t CtrlState) { switch(CtrlState) { case DEV_CTRLWAY_OPEN: switch(Mode) { case SCENE_MODE_CTRL: DevAction_ExpandCtrl(DevActionInfo); break; case LIGHT_MODE_CTRL: DevAction_ExpandLightOpen(DevActionInfo); break; } break; case DEV_CTRLWAY_CLOSE: switch(Mode) { case SCENE_MODE_CTRL: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"普通场景控制关闭,场景号:%d", DevActionInfo->DevActionCore.ActionNo); DevAction_ExpandClose(DevActionInfo, SceneMode); break; case LIGHT_MODE_CTRL: DevAction_ExpandLightClose(DevActionInfo); break; } break; case DEV_CTRLWAY_INVALID: //控制方式无效,就是取消所有的延时执行 DevAction_ExpandDlyClear(DevActionInfo); break; } } /******************************************************************************* * Function Name : DevAction_Output * Description : 设备动作输出执行 * Input : DevActionNo : 场景编号 Mode :0x01-场景控制,0x02-灯光控制 CtrlState :控制状态 1-开,2-关 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_No_Ctrl(uint16_t DevActionNo, uint8_t Mode, uint16_t CtrlState) { uint16_t i = 0x00; //用于遍历所有动作 uint32_t list_addr = 0x00; //动作的地址 DEV_ACTION_INFO DevActionInfo; Dev_Dly_Value Temp_Dly; if(DevActionNo == 0x00) return ; //直接退出 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"遍历所有动作,准备执行场景编号:%d", DevActionNo); for(i = 0; i < DevActionGlobal.DevActionNum; i++) { list_addr = SRAM_DevAction_List_Start_Addr + i*SRAM_DevAction_List_Size; SRAM_DMA_Read_Buff((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO), list_addr); if(DevActionInfo.DevActionCore.ActionNo == DevActionNo) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"找到相应的场景编号:%d 场景名%s,场景存储地址:%08X,立即执行,并清延时执行标志", \ DevActionNo, \ DevActionInfo.DevActionCore.DevActionName, \ list_addr); Temp_Dly.DelayCont = 0x00; Temp_Dly.DelayWeight = 0x00; DevDly_InfoSet(DevDlyAddr_Get(list_addr, DevActionNo), 0x00, 0x00, Temp_Dly, 0x00);//置延时执行标志位 先拿到延时节点的地址 if( (DevActionNo == ACTION_SCENE_SLEEP) || (DevActionInfo.DevActionCond.SceneExcute == ACTION_SCENE_SLEEP) ) { DevAction_Mode_Ctrl(&DevActionInfo, Mode, SLEEP_MODE_CTRL, CtrlState); }else { DevAction_Mode_Ctrl(&DevActionInfo, Mode, NOR_MODE_CTRL, CtrlState); } if( DevActionGlobal.ServerCtrl == 0x01 ) { DevActionGlobal.ServerCtrl = 0x00; if( DevActionInfo.DevActionCond.SceneExcute == ACTION_SCENE_SLEEP ) { if( DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01 ) //与夜灯有关,且夜灯存在 { if( DevActionGlobal.DevActionU64Cond.NeightState != NightModeStart) { DevActionGlobal.DevActionU64Cond.NeightState = NightModeStart; } } DevActionGlobal.SleepMode_State = 0x01; //睡眠模式开 DevActionGlobal.SleepLight_State = 0x00; //熄灭背光,关背光 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"进入睡眠场景"); }else { if( DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01 ) //与夜灯有关,且夜灯存在 { DevActionGlobal.DevActionU64Cond.NeightState = NightModeClose; } DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景"); } } break; } } } /******************************************************************************* * Function Name : DevAction_Output * Description : 设备动作输出执行 * Input : DevActionInfo : 设备动作信息结构体 * Return : None *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_Output(DEV_ACTION_INFO *DevActionInfo) { switch( DevActionInfo->DevActionCond.SceneExcute ) { case ACTION_SCENE_ONE: case ACTION_SCENE_MULTI: if( ( DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01 ) && ( 0x01 == DevActionInfo->DevActionCond.DevActionU64Cond.NeightFlag ) ) { switch( DevActionGlobal.DevActionU64Cond.NeightState ) { case NightModeStart: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景不可关闭 准备执行打开夜灯:"); DevActionGlobal.DevActionU64Cond.NeightState = NightModeOpen; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_OPEN); //打开夜灯 if( DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT ) { DevActionGlobal.SleepMode_State = 0x00; Logic_Music_Ctrl(0x00, 0x00, Find_Device_List_Information(0x15,0x01), 0x00, 0x0020); //起夜关音乐 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景 -1"); } break; case NightModeOpen: DevActionGlobal.DevActionU64Cond.NeightState = NightModeClose; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_CLOSE);//关闭夜灯 case NightModeClose: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景不可关闭开始对所有设备输出状态进行赋值:"); DevAction_ExpandCtrl(DevActionInfo); //执行当前场景 break; } }else { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 场景不可关闭开始对所有设备输出状态进行赋值:"); DevAction_ExpandCtrl(DevActionInfo); if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x00; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景 -2"); } } break; case ACTION_SCENE_TWO: //场景可关闭,执行相应动作 if( (DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01) && (DevActionInfo->DevActionCond.DevActionU64Cond.NeightFlag == 0x01) ) { switch(DevActionGlobal.DevActionU64Cond.NeightState) { case NightModeStart: DevActionGlobal.DevActionU64Cond.NeightState = NightModeOpen; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_OPEN); //打开夜灯 if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 2025-09-05 Logic_Music_Ctrl(0x00, 0x00, Find_Device_List_Information(0x15,0x01), 0x00, 0x0020); //起夜关音乐 } Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景 -3"); break; case NightModeClose: case NightModeOpen: if(NightModeOpen == DevActionGlobal.DevActionU64Cond.NeightState) { DevActionGlobal.DevActionU64Cond.NeightState = NightModeClose; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_CLOSE); //关闭夜灯 } if(DEV_STATE_CLOSE == DevActionInfo->DevActionState.SceneState) //当前场景为关 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景开"); DevAction_ExpandCtrl(DevActionInfo); //执行当前场景 } else if(DEV_STATE_OPEN == DevActionInfo->DevActionState.SceneState) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景关"); DevAction_ExpandClose(DevActionInfo, NOR_MODE_CTRL); //执行当前场景 } break; } }else { if(DEV_STATE_CLOSE == DevActionInfo->DevActionState.SceneState) //当前场景为关 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景开"); DevAction_ExpandCtrl(DevActionInfo); //执行当前场景 } else if(DEV_STATE_OPEN == DevActionInfo->DevActionState.SceneState) //当前场景为开 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景关"); DevAction_ExpandClose(DevActionInfo, NOR_MODE_CTRL); //执行当前场景 } if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景 -4"); } } break; case ACTION_SCENE_MAINSWITCH: //总开关 if( (DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01) && (DevActionInfo->DevActionCond.DevActionU64Cond.NeightFlag == 0x01) ) { switch(DevActionGlobal.DevActionU64Cond.NeightState) { case NightModeStart: DevActionGlobal.DevActionU64Cond.NeightState = NightModeOpen; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_OPEN); //打开夜灯 if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 Logic_Music_Ctrl(0x00, 0x00, Find_Device_List_Information(0x15,0x01), 0x00, 0x0020); //起夜关音乐 } break; case NightModeClose: case NightModeOpen: if(DevActionGlobal.DevActionU64Cond.NeightState == NightModeOpen) { DevActionGlobal.DevActionU64Cond.NeightState = NightModeClose; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_CLOSE); //关闭夜灯 } if(DevActionInfo->DevActionState.SceneState == DEV_STATE_CLOSE) //当前场景为关 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景开"); DevAction_ExpandLightOpen(DevActionInfo); //打开当前场景的灯光 } else if(DevActionInfo->DevActionState.SceneState == DEV_STATE_OPEN) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景关"); DevAction_ExpandClose(DevActionInfo, SLEEP_MODE_CTRL); //执行当前场景,灯光类设备关闭 } break; } }else { if(DevActionInfo->DevActionState.SceneState == DEV_STATE_CLOSE) //当前场景为关 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景开"); DevAction_ExpandLightOpen(DevActionInfo); //打开当前场景的灯光 } else if(DevActionInfo->DevActionState.SceneState == DEV_STATE_OPEN) //当前场景为开 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 场景可关闭开始对所有设备输出状态进行赋值:准备执行场景关"); DevAction_ExpandClose(DevActionInfo, SLEEP_MODE_CTRL); //执行当前场景 } if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 } } break; case ACTION_SCENE_SLEEP: //睡眠模式 ,全部关才算开,有一个开就算关。 if(DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01) //与夜灯有关 且夜灯存在 { if(DevActionGlobal.DevActionU64Cond.NeightState != NightModeStart) { DevActionGlobal.DevActionU64Cond.NeightState = NightModeStart; //进入起夜 DevAction_ExpandClose(DevActionInfo, SLEEP_MODE_CTRL); //睡眠场景为开 但是得关闭所有灯 并播放相应词条 DevActionGlobal.SleepMode_State = 0x01; //睡眠模式开 DevActionGlobal.SleepLight_State = 0x00; //熄灭 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"进入睡眠场景 1"); }else{ DevActionGlobal.DevActionU64Cond.NeightState = NightModeOpen; DevAction_ExpandLightOpen(DevActionInfo); //打开夜灯 DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 Logic_Music_Ctrl(0x00, 0x00, Find_Device_List_Information(0x15,0x01), 0x00, 0x0020); //起夜关音乐 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退出睡眠场景 1"); } }else{ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 睡眠场景开始对所有设备输出状态进行赋值:"); DevAction_ExpandCtrl(DevActionInfo); //执行当前场景 DevActionGlobal.SleepMode_State = 0x01; //睡眠模式关 DevActionGlobal.SleepLight_State = 0x00; //熄灭 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"进入睡眠场景 2"); } break; case ACTION_SCENE_HELPSLEEP: //助眠模式 按下打开夜灯开启标志。此时按下普通按键,就能关闭夜灯,并取消睡眠倒计时 if((DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01 )&& (DevActionInfo->DevActionCond.DevActionU64Cond.NeightFlag == 0x01)) //与夜灯有关 且夜灯存在 { switch(DevActionGlobal.DevActionU64Cond.NeightState) { case NightModeStart: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景助眠 准备执行打开夜灯:"); DevActionGlobal.DevActionU64Cond.NeightState = NightModeOpen; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_OPEN);//打开夜灯 并取消睡眠倒计时 if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 } Logic_Music_Ctrl(0x00, 0x00, Find_Device_List_Information(0x15,0x01), 0x00, 0x0020); //起夜关音乐 break; case NightModeClose: case NightModeOpen: if(DevActionGlobal.DevActionU64Cond.NeightState == NightModeOpen) //夜灯标志开启 { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景助眠将夜灯标志关闭"); DevActionGlobal.DevActionU64Cond.NeightState = NightModeClose; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_CLOSE);//关闭夜灯 } Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 场景助眠开始对所有设备输出状态进行赋值:"); DevAction_ExpandCtrl(DevActionInfo); //执行当前场景 if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.DevActionU64Cond.NeightState = NightModeStart; //进入起夜 DevActionGlobal.SleepMode_State = 0x01; //睡眠模式开 DevActionGlobal.SleepLight_State = 0x00; //熄灭 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"进入睡眠场景 3"); } break; } }else{ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 助眠场景开始对所有设备输出状态进行赋值:"); DevAction_ExpandCtrl(DevActionInfo); //执行当前场景 if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x01; //睡眠模式开 DevActionGlobal.SleepLight_State = 0x00; //熄灭 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"进入睡眠场景 4"); } } break; #if RS485_Switch_Rotary_Flag case ACTION_SCENE_Rotary: //旋转场景 if((DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01) && (DevActionInfo->DevActionCond.DevActionU64Cond.NeightFlag == 0x01)) //与夜灯有关 { switch(DevActionGlobal.DevActionU64Cond.NeightState) { case NightModeStart: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 旋钮场景 准备执行打开夜灯:"); DevActionGlobal.DevActionU64Cond.NeightState = NightModeOpen; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_OPEN);//打开夜灯 if(DevActionInfo->DevActionInput.DevType == DEV_RS485_SWT) { DevActionGlobal.SleepMode_State = 0x00; //睡眠模式关 2025-09-05 } break; case NightModeClose: case NightModeOpen: if(NightModeOpen == DevActionGlobal.DevActionU64Cond.NeightState) { DevActionGlobal.DevActionU64Cond.NeightState = NightModeClose; DevAction_No_Ctrl(DevActionGlobal.SleepActionNo, 0x02, DEV_CTRLWAY_CLOSE);//关闭夜灯 } Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯有关 旋钮场景 开始对所有设备输出状态进行赋值:"); DevAction_RotaryCtrl(DevActionInfo); break; } }else{ Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 旋钮场景开始对所有设备输出状态进行赋值:"); DevAction_RotaryCtrl(DevActionInfo); } break; #endif case ACTION_SCENE_SLEEP_UNRELATED: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"与夜灯无关 无卡取电-任意按键 准备执行打开夜灯:"); DevAction_ExpandCtrl(DevActionInfo); //执行当前场景 break; } if(DevActionGlobal.DevActionU64Cond.NeightState != DevActionGlobal.Last_NeightState) { DevActionGlobal.Last_NeightState = DevActionGlobal.DevActionU64Cond.NeightState; } } /******************************************************************************* * @Function Name : DevAction_IndicateCtrl * @Description : 设备动作反馈灯输出执行 * @Input : * DevActionInfo : 设备动作信息 * @Return :无 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_IndicateCtrl(DEV_ACTION_INFO *DevActionInfo) { uint8_t i = 0x00; uint8_t CtrlWay = 0x00; Device_Public_Information_G BUS_Public; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"场景状态改变准备执行反馈灯控制:场景名:%s,控制状态:%d,设备数量:%d", DevActionInfo->DevActionCore.DevActionName, DevActionInfo->DevActionState.SceneState, DevActionInfo->DevCtrlNum); for(i = 0; i < DevActionInfo->DevCtrlNum; i++) { if(DevActionInfo->DevActionOutput[i].DevActionOutAddr != 0x00) { switch(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevType) { case DEV_RS485_SWT: case Dev_Host_LVoutput: CtrlWay = DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState&0x00ff; switch(CtrlWay) { case DEV_CTRLWAY_RELATESCENE: switch(DevActionInfo->DevActionState.SceneState) { case DEV_STATE_OPEN: case DEV_STATE_CLOSE: SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevActionInfo->DevActionOutput[i].DevActionOutAddr); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"反馈灯控制顺便清延时执行,设备类型: %d 地址:%d,回路:%d,状态:%d", BUS_Public.type, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionState.SceneState); DevDly_InfoSet( DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x00); //关闪烁 关延时 if(NULL != BUS_Public.DevFunInfo.Dev_Output_Ctrl) { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutAddr, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionState.SceneState); //根据场景状态去控制反馈灯 } break; } break; case CFG_Dev_CtrlWay_Is_RelateBlink: if(0x00 != DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue.DelayCont) //立即执行 { switch(DevActionInfo->DevActionState.SceneState) { case DEV_STATE_OPEN: //开启闪烁 应先开指示灯 SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevActionInfo->DevActionOutput[i].DevActionOutAddr); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开启闪烁,状态:%04X",CFG_Dev_CtrlWay_Is_TOGGLE |(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState&0xff00)); DevDly_InfoSet( DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x01, CFG_Dev_CtrlWay_Is_TOGGLE |(DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState&0xff00), DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x01); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutAddr, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DEV_CTRLWAY_OPEN | ( DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState & 0xff00 ) ); } break; case DEV_STATE_CLOSE: //关闭闪烁 应后关指示灯 Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"关闭闪烁"); DevDly_InfoSet( DevActionInfo->DevActionOutput[i].DevDlyAddr, 0x01, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevDlyValue, 0x02); break; } } break; } break; case Dev_NodeCurtain: if( (DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevCtrlState & 0x00ff) == DEV_CTRLWAY_RELATESCENE ) { if( DevActionInfo->DevActionState.SceneState == DEV_STATE_OPEN ) { switch(DevActionInfo->DevActionInput.inType) { case DEV_CTRLWAY_OPEN: //开 case DEV_CTRLWAY_CLOSE: //关 case DEV_CTRLWAY_STOP: //停 SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevActionInfo->DevActionOutput[i].DevActionOutAddr); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"反馈灯控制顺便清延时执行,设备类型: %d 地址:%d,回路:%d,状态:%d", BUS_Public.type, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevAddr, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionState.SceneState); if(BUS_Public.DevFunInfo.Dev_Output_Ctrl != NULL) { BUS_Public.DevFunInfo.Dev_Output_Ctrl( 0x00, 0x00, DevActionInfo->DevActionOutput[i].DevActionOutAddr, DevActionInfo->DevActionOutput[i].DevActionOutCfg.DevOutputLoop, DevActionInfo->DevActionInput.inType); } break; } } } break; } } } } /******************************************************************************* * @Function Name : BLV_DevAction_Cycle * @Description : 遍历所有的动作,相同输入触发节点的动作一起扫描 * @Input : * Dev_processing_addr : 设备动作地址 * BUS_Public :公共属性 * @Return :无 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void BLV_DevAction_Cycle(uint32_t Dev_processing_addr,Device_Public_Information_G *BUS_Public) { DEV_ACTION_INFO DevActionInfo; //设备动作全部信息 - 占用512Byte uint32_t DevActionAddr = 0x00,temp_offset = 0x00; //用于遍历所有动作存在 uint16_t j = 0x00; //用于遍历动作存在 uint8_t BreakFlag = 0x00; //跳出循环标志 有设备控制执行 for(j = BUS_Public->ActionCoord; j < DevActionGlobal.DevActionNum; j++) //这里为啥需要这个循环???? - 疑问点 { DevActionAddr = SRAM_DevAction_List_Start_Addr + j*SRAM_DevAction_List_Size; temp_offset = DevActionAddr + sizeof(Dev_Action_Core) + sizeof(Dev_Action_Input) + sizeof(Dev_Action_Cond) + sizeof(Dev_Action_State) - 4; if(SRAM_Read_DW(temp_offset) == Dev_processing_addr) //拥有相同的输入触发节点 DevActionInfo.DevActionState.DevAddrIn { SRAM_DMA_Read_Buff((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO), DevActionAddr); //完整拷贝设备动作信息 根据设备输出数量去执行控制 if( Data_CheckSum((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO)) != 0x00 ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作参数校验未通过:%d"); continue; } RcuLockState_Scan(); DevAction_State_Get(&DevActionInfo); //当前场景状态更新 结合所有设备输出去判断 if( DevActionInfo.DevActionCond.DevActionU64Cond.DevActionOutFlag == 0x00 ) //设备动作 - 条件中动作启用标志位 { if( DevActionInfo.DevActionState.SceneReuseFlag == 0x00 ) //场景状态 - 复用标志位不成立 疑问点:复用标志位的作用是什么??? { if( (BUS_Public->DevFunInfo.Dev_Input_Type_Get != NULL) && (BUS_Public->DevFunInfo.Dev_Input_Type_Get(DevActionInfo.DevActionState.DevAddrIn, DevActionInfo.DevActionInput.inAddr, DevActionInfo.DevActionInput.inType) == CtrlValid) ) { if(BLV_DevAction_Cond_Judge(&DevActionInfo) == CondIsPass) { BreakFlag = 0x01; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备类型:%d 设备地址%d 输入地址:%d 地址编号:%d 动作地址:%08X通过", \ DevActionInfo.DevActionInput.DevType, \ DevActionInfo.DevActionInput.DevAddr, \ DevActionInfo.DevActionInput.inAddr, \ DevActionInfo.DevActionCore.ActionNo, \ DevActionAddr); DevAction_Output(&DevActionInfo); //执行输出控制 }else if(DevActionInfo.DevActionCond.DevActionU64Cond.EleCtrlFlag == 0x01) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备类型:%d 设备地址%d 输入地址:%d 地址编号:%d 动作地址:%08X未通过,但是有控取电开标志", DevActionInfo.DevActionInput.DevType, DevActionInfo.DevActionInput.DevAddr, DevActionInfo.DevActionInput.inAddr, DevActionInfo.DevActionCore.ActionNo, DevActionAddr); if(0x00 == Get_Authorize_Lock_Status()) //授权锁定判断 { BreakFlag = 0x01; Ele_Ctrl_OpenClose(0x01); //控制取电服务打开 } } } }else if(DevActionInfo.DevActionState.SceneReuseFlag == 0x01) //存在复用标志 { if( (DevActionInfo.DevActionCond.SceneExcute == ACTION_SCENE_MULTI) && (DevActionInfo.DevActionInput.DevType == DEV_RS485_SWT) ) { if( (CondIsPass == BLV_DevAction_Cond_Judge(&DevActionInfo)) && (BUS_Public->DevFunInfo.Dev_Input_Type_Get != NULL) ) { uint8_t ret = BUS_Public->DevFunInfo.Dev_Input_Type_Get(DevActionInfo.DevActionState.DevAddrIn, DevActionInfo.DevActionInput.inAddr, DevActionInfo.DevActionInput.inType); if( (ret & 0x01) == CtrlValid ) { if( DevActionInfo.DevActionState.MultiNumber == (ret >> 0x01) ) { BreakFlag = 0x01; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"多联场景别名:%s,设备类型复用:%d 设备地址%d 输入地址:%d 动作编号:%d 动作地址:%08X通过", DevActionInfo.DevActionCore.DevActionName, DevActionInfo.DevActionInput.DevType, DevActionInfo.DevActionInput.DevAddr, DevActionInfo.DevActionInput.inAddr, DevActionInfo.DevActionCore.ActionNo, DevActionAddr); DevAction_Output(&DevActionInfo); //执行输出控制 }else { //当前动作多联下标和开关触发多联下标不相等,重新寻找动作地址 uint32_t TempAddr = 0x00,deal_addr = 0; deal_addr = TempAddr+sizeof(Dev_Action_Core)+sizeof(Dev_Action_Input)+sizeof(Dev_Action_Cond)+sizeof(Dev_Action_State) - 4 ; for(uint8_t i = 0; i < DevActionGlobal.DevActionNum; i++ ) { TempAddr = SRAM_DevAction_List_Start_Addr + i * SRAM_DevAction_List_Size; if( SRAM_Read_DW(deal_addr) == Dev_processing_addr ) { deal_addr = deal_addr - 3; if( SRAM_Read_Byte(deal_addr) == (ret >> 0x01) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"找到多联编号:%d 动作地址:%08X",SRAM_Read_Byte(deal_addr),TempAddr); break; } } } deal_addr = TempAddr+sizeof(Dev_Action_Core)+sizeof(Dev_Action_Input)+sizeof(Dev_Action_Cond)+sizeof(Dev_Action_State) - 4 ; if( (TempAddr != 0x00) && (SRAM_Read_DW(deal_addr) == Dev_processing_addr) ) { SRAM_DMA_Read_Buff((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO), TempAddr); if( Data_CheckSum( (uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO) ) != 0x00 ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作参数校验未通过:%d"); continue ; } BreakFlag = 0x01; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"多联场景别名:%s,设备类型复用:%d 设备地址%d 输入地址:%d 动作编号:%d 动作地址:%08X通过", DevActionInfo.DevActionCore.DevActionName, DevActionInfo.DevActionInput.DevType, DevActionInfo.DevActionInput.DevAddr, DevActionInfo.DevActionInput.inAddr, DevActionInfo.DevActionCore.ActionNo, DevActionAddr); DevAction_Output(&DevActionInfo); //执行输出控制 } } } } }else { if( (BLV_DevAction_Cond_Judge(&DevActionInfo) == CondIsPass) && (BUS_Public->DevFunInfo.Dev_Input_Type_Get != NULL) && ( BUS_Public->DevFunInfo.Dev_Input_Type_Get( DevActionInfo.DevActionState.DevAddrIn, DevActionInfo.DevActionInput.inAddr, DevActionInfo.DevActionInput.inType ) == CtrlValid ) ) { BreakFlag = 0x01; Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"场景别名:%s,设备类型复用:%d 设备地址%d 输入地址:%d 动作编号:%d 动作地址:%08X通过", DevActionInfo.DevActionCore.DevActionName, DevActionInfo.DevActionInput.DevType, DevActionInfo.DevActionInput.DevAddr, DevActionInfo.DevActionInput.inAddr, DevActionInfo.DevActionCore.ActionNo, DevActionAddr); DevAction_Output(&DevActionInfo); //执行输出控制 } } } } if(BreakFlag == 0x01) //本地产生事件,就立即刷新场景状态 { DevAction_State_Get(&DevActionInfo); //当前场景状态更新 结合所有设备输出去判断 } //场景状态改变,控制反馈灯 if( DevActionInfo.DevActionState.SceneState != DevActionInfo.DevActionState.SceneStateLast ) { DevActionInfo.DevActionState.SceneStateLast = DevActionInfo.DevActionState.SceneState; DevAction_IndicateCtrl(&DevActionInfo); DevActionInfo.CheckVal = 0x00; DevActionInfo.CheckVal = Data_CheckSum((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO)); SRAM_DMA_Write_Buff((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO), DevActionAddr); } if(BreakFlag == 0x01) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作下标:%d", j); break; } } } } /******************************************************************************* * @Function Name : BLV_DevAction_Task * @Description : BLV设备动作任务处理函数 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void BLV_DevAction_Task(void) { static uint32_t dev_action_processing_tick = 0; uint32_t Dev_processing_addr; Device_Public_Information_G BUS_Public; //公有全局数据 uint8_t BreakFlag = 0x00; if( SysTick_1ms - dev_action_processing_tick >= 50) { if(DevActionGlobal.Devi >= DevActionGlobal.DevNum) { DevActionGlobal.Devi = 0x00; } for( ; DevActionGlobal.Devi < DevActionGlobal.DevNum ;) { Dev_processing_addr = SRAM_Device_List_Start_Addr + DevActionGlobal.Devi*SRAM_Device_List_Size; switch(SRAM_Read_Byte(Dev_processing_addr+Dev_Type)) { case Dev_Host_LVinput: //虚拟设备 - 弱电输入 case Dev_NodeCurtain: //干接点设备 - 窗帘 case DEV_RS485_CARD: //RS485设备 - 插卡取电 case DEV_RS485_TEMP: //RS485设备 - 温控器 case Dev_Host_Service: //虚拟设备 - 服务信息 case DEV_RS485_SWT: //RS485设备 - 开关 case DEV_RS485_PWM: //RS485设备 - 调光 case DEV_RS485_FreshAir: //RS485设备 - 新风 case DEV_RS485_HEATER: //RS485设备 - 地暖 case Dev_Rs458_RotaryCtrl: //RS485设备 - 旋钮开关 case DEV_Virtual_Card: //虚拟设备 - 无卡取电 case DEV_Carbon_Saved: //虚拟设备 - 碳达人 case Dev_Scene_Restore: //虚拟设备 - 场景还原 BreakFlag = 0x01; SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), Dev_processing_addr); //拷贝所有公有数据 BLV_DevAction_Cycle(Dev_processing_addr, &BUS_Public); //找到输入节点,把地址和全局属性传进去 break; } DevActionGlobal.Devi++; if(BreakFlag == 0x01) break; } dev_action_processing_tick = SysTick_1ms; } } /******************************************************************************* * @Function Name : BLV_DevAction_Cycle * @Description : 遍历所有的动作,相同输入触发节点的动作一起扫描 * @Input : * Dev_processing_addr : 设备动作地址 * BUS_Public :公共属性 * @Return :无 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void DevAction_DevAddr_Ctrl( uint32_t DevActionAddr, uint8_t Mode, uint8_t SceneMode, uint16_t CtrlState) { DEV_ACTION_INFO DevActionInfo; if( (DevActionAddr < SRAM_DevAction_List_Start_Addr) || (DevActionAddr >= SRAM_DevAction_List_End_Addr) ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"场景地址无效:%08X",DevActionAddr); return ; } SRAM_DMA_Read_Buff((uint8_t *)&DevActionInfo, sizeof(DEV_ACTION_INFO), DevActionAddr); Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"场景控制,场景地址有效:%08X,场景号:%d",DevActionAddr, DevActionInfo.DevActionCore.ActionNo); if( DevActionInfo.DevActionCore.ActionNo == ACTION_SCENE_SLEEP ) { if( DevActionGlobal.DevActionU64Cond.NeightFlag == 0x01 ) { if( DevActionGlobal.DevActionU64Cond.NeightState != NightModeStart ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备输出场景控制,有场景控制睡眠,进入起夜"); DevActionGlobal.DevActionU64Cond.NeightState = NightModeStart; } } DevAction_Mode_Ctrl(&DevActionInfo, LIGHT_MODE_CTRL, SLEEP_MODE_CTRL, DEV_CTRLWAY_CLOSE); }else { DevAction_Mode_Ctrl(&DevActionInfo, Mode, SceneMode, CtrlState); } } /******************************************************************************* * @Function Name : BLV_DevDly_Process * @Description : 延时设备处理函数 * 延时设备执行有两种: * 设备控制 * 挂起动作继续执行 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void BLV_DevDly_Process(uint32_t dly_processing_addr) { Struct_Dev_Dly DevDlyInfo; uint8_t KeepFlag = 0x00; Dev_Output_Ctrl_ptr Dev_Output_Ctrl; SRAM_DMA_Read_Buff((uint8_t *)&DevDlyInfo, sizeof(Struct_Dev_Dly), dly_processing_addr); if( (DevDlyInfo.DlyExcuteFlag == 0x01) && (SysTick_1ms >= DevDlyInfo.DlyExcuteTime) ) { DevDlyInfo.DlyExcuteFlag = 0x00; //标志清0 KeepFlag = 0x01; if(DevDlyInfo.DevDlyCore.DevDlyAddr != 0x00) { switch(DevDlyInfo.DevDlyCore.DevType) { case Dev_Host_HVout: case Dev_Host_LVoutput: case Dev_Host_Service: case Dev_NodeCurtain: case DEV_RS485_TEMP: case DEV_RS485_SWT: case DEV_RS485_STRIP: case DEV_RS485_PWM: case DEV_RS485_MUSIC: case DEV_RS485_CURTAIN: case DEV_RS485_FreshAir: case DEV_RS485_HEATER: case Dev_Rs485_PB20: case Dev_Rs485_PB20_LD: case Dev_Rs485_PB20_LS: case Dev_Rs485_PB20_Relay: case DEV_Virtual_NoCard: case DEV_Virtual_Card: case DEV_Virtual_ColorTemp: case Dev_485_BLE_Music: case DEV_Carbon_Saved: case Dev_Energy_Monitor: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"延时设备执行类型:%d %d路 内容: %04X",DevDlyInfo.DevDlyCore.DevType, DevDlyInfo.DevDlyCore.DevOutputLoop ,DevDlyInfo.DevOutputType); Dev_Output_Ctrl = (Dev_Output_Ctrl_ptr)SRAM_Read_DW(DevDlyInfo.DevDlyCore.DevDlyAddr + Dev_Output_Ctrl_0); if(Dev_Output_Ctrl != NULL) { Dev_Output_Ctrl(0x00, 0x00, DevDlyInfo.DevDlyCore.DevDlyAddr, DevDlyInfo.DevDlyCore.DevOutputLoop, DevDlyInfo.DevOutputType); } break; case Dev_Host_Invalid: Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"场景延时执行到时间,场景地址:%08X 状态: %04X",DevDlyInfo.DevDlyCore.DevDlyAddr, DevDlyInfo.DevOutputType); DevAction_DevAddr_Ctrl(DevDlyInfo.DevDlyCore.DevDlyAddr, 0x01, NOR_MODE_CTRL, DevDlyInfo.DevOutputType); break; } } if( KeepFlag == 0x01 ) { SRAM_DMA_Write_Buff((uint8_t *)&DevDlyInfo,sizeof(Struct_Dev_Dly),dly_processing_addr); } if( DevDlyInfo.DlyBlinkFlag == 0x01 ) { Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前延时链表存在延时闪烁执行类型:%d %d路 内容: %04X",DevDlyInfo.DevDlyCore.DevType, DevDlyInfo.DevDlyCore.DevOutputLoop ,DevDlyInfo.DevOutputType); //继电器状态赋值 DevDly_InfoSet(dly_processing_addr, 0x01, DevDlyInfo.DevOutputType, DevDlyInfo.DlyBlinkTime, 0x01); }else if( DevDlyInfo.DlyBlinkFlag == 0x02 ) { DevDly_InfoSet(dly_processing_addr, 0x01, DEV_CTRLWAY_CLOSE, DevDlyInfo.DlyBlinkTime, 0x00); } } } /******************************************************************************* * @Function Name : BLV_DevDly_Task * @Description : BLV设备动作任务处理函数 *******************************************************************************/ __attribute__((section(".non_0_wait"))) void BLV_DevDly_Task(void) { static uint32_t dev_devdly_processing_tick = 0; uint32_t dly_processing_addr = 0; if( SysTick_1ms - dev_devdly_processing_tick >= 10 ) { dev_devdly_processing_tick = SysTick_1ms; if( DevActionGlobal.DevDlyi > DevActionGlobal.DevDlyNum ) DevActionGlobal.DevDlyi = 0x00; dly_processing_addr = SRAM_DevDly_List_Start_Addr + DevActionGlobal.DevDlyi*DevDlyStructLen; BLV_DevDly_Process(dly_processing_addr); DevActionGlobal.DevDlyi++; } }