Files
RCU_C1P_Module/MCU_Driver/logic_file_function.c
caocong cc8783e9f8 feat:新增TFTP IAP升级功能
修改事项:
1、新增TFTP IAP升级功能,只是代码移植完毕,没有测试使用
2、代码空间编译优化,零等待区域空间已满,而应用层代码已全部挪移到非零等待区域中,但还是会增加零等待区的空间占用。 待优化
2025-12-10 14:06:45 +08:00

3932 lines
166 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* logic_file_function.c
*
* Created on: Nov 11, 2025
* Author: cc
*/
#include "includes.h"
#include <stdint.h>
#include <string.h>
/*******************************************************************************
* Function Name : DevAction_CondData_Init
* Description : 动作条件参数数据初始化
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void DevAction_CondData_Init(void)
{
DevActionGlobal.DevActionU64Cond.RcuLockState = Get_Authorize_Lock_Status();
}
/*******************************************************************************
* Function Name : Action_Coord_Get
* Description : 动作下标得到
* Input :
Dev_processing_addr :设备节点地址
BUS_Public :公有数据
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Action_Coord_Get(uint32_t Dev_processing_addr, Device_Public_Information_G *BUS_Public)
{
uint16_t i;
uint32_t DevActionAddr;
for(i = 0; i < DevActionGlobal.DevActionNum; i++) //
{
DevActionAddr = SRAM_DevAction_List_Start_Addr + i*SRAM_DevAction_List_Size;
if(SRAM_Read_DW(DevActionAddr+sizeof(Dev_Action_Core)+sizeof(Dev_Action_Input)+sizeof(Dev_Action_Cond)+sizeof(Dev_Action_State)-4) == Dev_processing_addr)
{
BUS_Public->ActionCoord = i; //当前第一个触发节点与设备输入节点一致的动作
break;
}
}
}
/*******************************************************************************
* Function Name : Action_Coord_Get
* Description : 设备下标得到
* Input :
Dev_processing_addr :设备节点地址
BUS_Public :公有数据
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Dev_Coord_Get(void)
{
uint16_t i; //遍历设备
uint32_t Dev_processing_addr;
Device_Public_Information_G BUS_Public; //公有全局数据
for(i = 0; i < DevActionGlobal.DevNum; i++)
{
Dev_processing_addr = SRAM_Device_List_Start_Addr + i*SRAM_Device_List_Size;
SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), Dev_processing_addr); //拷贝所有公有数据
BUS_Public.DevCoord = i; //拿到设备下标
Action_Coord_Get(Dev_processing_addr, &BUS_Public); //拿到动作下标
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前设备准备重新保存,地址:%08X设备类型:%d设备地址:%d设备下标:%d动作下标:%d", Dev_processing_addr, BUS_Public.type, BUS_Public.addr, BUS_Public.DevCoord, BUS_Public.ActionCoord);
switch(BUS_Public.type)
{
case Dev_Host_HVout: //类型为继电器
if((ENUM_RS485_DEV_PRO_01 == BUS_Public.Protocol)&&(0x00 == BUS_Public.addr)) //1号协议 地址为0
{
// NOR_HVOUT_INFO DevHVoutInfo; //继电器局部变量
// SRAM_DMA_Read_Buff((uint8_t *)&DevHVoutInfo,sizeof(NOR_HVOUT_INFO),Dev_processing_addr+Dev_Privately);
//
// DevHVoutInfo.DevC5IOAddr = Find_AllDevice_List_Information(DEV_C5IO_Type, 0x00); //拿到C5IO存储地址
// Dbg_Println(DBG_BIT_DEVICE_STATUS_bit,"DevHVoutInfo.DevC5IOAddr:%08X", DevHVoutInfo.DevC5IOAddr);
// SRAM_DMA_Write_Buff((uint8_t *)&DevHVoutInfo,sizeof(NOR_HVOUT_INFO),Dev_processing_addr+Dev_Privately); //继电器私有数据重新写入
}
break;
}
/*重新保存当前设备*/
BUS_Public.check = 0x00;
SRAM_Write_Byte(BUS_Public.check, Dev_processing_addr+Dev_Check); //清校验
SRAM_Write_Word(BUS_Public.DevCoord, Dev_processing_addr+Dev_Coord); //重新写入设备下标
SRAM_Write_Word(BUS_Public.ActionCoord, Dev_processing_addr+Dev_ActionCoord); //重新写入动作下标
BUS_Public.check = Log_CheckSum(Dev_processing_addr,BUS_Public.data_len); //重新计算整包校验 DoubleData_CheckSum((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), (uint8_t *)&Rs485SwiInfo, sizeof(RS485_SWI_INFO));
SRAM_Write_Byte(BUS_Public.check, Dev_processing_addr+Dev_Check); //重新写入校验
}
}
/*******************************************************************************
* Function Name : DevAction_ReuseFlag_Get
* Description : 为复用动作复用标志得到
* 每个动作遍历所有的动作 相同的输入节点和回路,该动作的复用标志就置一。置一后,扫描动作时会先判断
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void DevAction_ReuseFlag_Get(void)
{
uint16_t i = 0x00,j = 0x00,k = 0x00; //用于遍历所有动作
uint32_t list_addri = 0x00,list_addrj = 0x00;
DEV_ACTION_INFO DevActionInfoi; //当前设备动作全部信息
DEV_ACTION_INFO DevActionInfoj; //当前设备动作全部信息
for(i = 0; i < DevActionGlobal.DevActionNum; i++)
{
list_addri = SRAM_DevAction_List_Start_Addr + i * SRAM_DevAction_List_Size;
SRAM_DMA_Read_Buff((uint8_t *)&DevActionInfoi, sizeof(DEV_ACTION_INFO), list_addri);
DevActionInfoi.DevActionState.DevAddrIn = Find_AllDevice_List_Information(DevActionInfoi.DevActionInput.DevType, DevActionInfoi.DevActionInput.DevAddr);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作设备数量:%d设备输入类型:%d设备输入地址:%d,设备输入地址:%04x",
DevActionInfoi.DevCtrlNum,
DevActionInfoi.DevActionInput.DevType,
DevActionInfoi.DevActionInput.DevAddr,
DevActionInfoi.DevActionState.DevAddrIn);
Dbg_Print_Buff(DBG_BIT_LOGIC_STATUS_bit,"当前动作数据打印:",(uint8_t *)&DevActionInfoi,sizeof(Dev_Action_Core) + sizeof(Dev_Action_Input)+sizeof(Dev_Action_Cond)+sizeof(Dev_Action_State));
for(j = 0; j < DevActionGlobal.DevActionNum ; j++)
{
if( j != i )
{
list_addrj = SRAM_DevAction_List_Start_Addr + j * SRAM_DevAction_List_Size;
SRAM_DMA_Read_Buff((uint8_t *)&DevActionInfoj, sizeof(DEV_ACTION_INFO), list_addrj);
if( ( DevActionInfoi.DevActionCond.DevActionU64Cond.DevActionOutFlag == 0x00 )
&& ( DevActionInfoj.DevActionCond.DevActionU64Cond.DevActionOutFlag == 0x00 )
&& ( DevActionInfoi.DevActionInput.DevType == DevActionInfoj.DevActionInput.DevType )
&& ( DevActionInfoi.DevActionInput.DevAddr == DevActionInfoj.DevActionInput.DevAddr )
&& ( DevActionInfoi.DevActionInput.inAddr == DevActionInfoj.DevActionInput.inAddr )
&& ( DevActionInfoi.DevActionInput.inType == DevActionInfoj.DevActionInput.inType ) )
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作地址:%08X之前动作地址:%08X", list_addri, list_addrj);
DevActionInfoi.DevActionState.SceneReuseFlag = 0x01;
if( (DevActionInfoi.DevActionInput.DevType == DEV_RS485_SWT)
&& (DevActionInfoi.DevActionCond.SceneExcute == ACTION_SCENE_MULTI)
&& (DevActionInfoj.DevActionInput.DevType == DEV_RS485_SWT)
&& (DevActionInfoj.DevActionCond.SceneExcute == ACTION_SCENE_MULTI) )
{
if( j > i )
{
if( (DevActionInfoi.DevActionState.MultiValidNo == 0x00)
&& (DevActionInfoi.DevActionState.MultiSetFlag == 0x00) )
{
DevActionInfoi.DevActionState.MultiSetFlag = 0x01;
DevActionInfoi.DevActionState.MultiNumber = 0x01;
DevActionInfoi.DevActionState.MultiValidNo++;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开关:%d 回路:%d 多联起始地址:%08X 多联下标:%d",
DevActionInfoi.DevActionInput.DevAddr,
DevActionInfoi.DevActionInput.inAddr,
list_addri,
DevActionInfoi.DevActionState.MultiNumber);
}
if(DevActionInfoj.DevActionState.MultiSetFlag == 0x00)
{
Device_Public_Information_G BUS_Public;
RS485_SWI_INFO Rs485SwiInfo;
uint32_t DevAdd = 0x00;
DevActionInfoi.DevActionState.MultiValidNo++;
DevActionInfoj.DevActionState.MultiNumber = DevActionInfoi.DevActionState.MultiValidNo;
DevActionInfoj.DevActionState.MultiSetFlag = 0x01;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开关:%d 回路:%d 多联当前地址:%08X 多联下标:%d",
DevActionInfoj.DevActionInput.DevAddr,
DevActionInfoj.DevActionInput.inAddr,
list_addrj,
DevActionInfoj.DevActionState.MultiNumber);
//待优化,
for(k = 0; k < SRAM_DevAction_List_Size; k++)
{
SRAM_Write_Byte(0x00,list_addrj+k);
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"因为多联下标置位准备重新保存,地址:%08X", list_addrj);
DevActionInfoj.CheckVal = 0x00;
SRAM_DMA_Write_Buff((uint8_t *)&DevActionInfoj, DevActionInfoj.data_len, list_addrj);
DevActionInfoj.CheckVal = DevAction_CheckSum(list_addrj,DevActionInfoj.data_len);
SRAM_Write_Byte(DevActionInfoj.CheckVal, ( list_addrj + sizeof(Dev_Action_Core) + sizeof(Dev_Action_Input) + sizeof(Dev_Action_Cond) + sizeof(Dev_Action_State) ) );
DevAdd = Find_AllDevice_List_Information2(Active_Port, DevActionInfoi.DevActionInput.DevType, DevActionInfoi.DevActionInput.DevAddr);
if(DevAdd != 0x00)
{
SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public,sizeof(Device_Public_Information_G),DevAdd);
SRAM_DMA_Read_Buff((uint8_t *)&Rs485SwiInfo,sizeof(RS485_SWI_INFO),DevAdd+Dev_Privately);
if(DevActionInfoi.DevActionState.MultiValidNo <= 127)
{
Rs485SwiInfo.MultiValidNo[DevActionInfoi.DevActionInput.inAddr] = DevActionInfoi.DevActionState.MultiValidNo;
}
BUS_Public.check = 0x00;
BUS_Public.check = DoubleData_CheckSum((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), (uint8_t *)&Rs485SwiInfo, sizeof(RS485_SWI_INFO));
SRAM_DMA_Write_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G),DevAdd);
SRAM_DMA_Write_Buff((uint8_t *)&Rs485SwiInfo,sizeof(RS485_SWI_INFO),DevAdd+Dev_Privately);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%d 多联开关,回路:%d 有效联数:%d",
DevActionInfoi.DevActionInput.DevAddr,
DevActionInfoi.DevActionInput.inAddr,
Rs485SwiInfo.MultiValidNo[DevActionInfoi.DevActionInput.inAddr]);
}
}
}
}else {
break;
}
}
}
}
for( k = 0; k < DevActionInfoi.DevCtrlNum; k++ )
{
if(DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevType == Dev_Host_Invalid) //唯有场景
{
DevActionInfoi.DevActionOutput[k].DevActionOutAddr = DevAction_No_Get(DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevOutputLoop);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作包含场景,地址:%08X 场景地址:%08X 下标:%d 回路:%d",
list_addri,
DevActionInfoi.DevActionOutput[k].DevActionOutAddr,
i,
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevOutputLoop);
}else {
DevActionInfoi.DevActionOutput[k].DevActionOutAddr = Find_AllDevice_List_Information(
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevType,
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevAddr);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"扩展设备输入类型:%d扩展设备输入地址:%d,扩展设备回路地址:%d,扩展设备存储地址:%04x",
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevType,
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevAddr,
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevOutputLoop,
DevActionInfoi.DevActionOutput[k].DevActionOutAddr);
}
if(DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevDlyValue.DelayCont != 0x00)
{
DevActionInfoi.DevActionOutput[k].DevDlyAddr = Add_DevDly_To_List(
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevType,
DevActionInfoi.DevActionOutput[k].DevActionOutAddr,
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevOutputLoop);
if(Dev_Host_Invalid != DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevType)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作包含延时设备准备重新保存,地址:%08X 下标:%d,延时节点:%08X 有涉及到延时设备地址:%08X, 回路:%d",
list_addri,
i,
DevActionInfoi.DevActionOutput[k].DevDlyAddr,
DevActionInfoi.DevActionOutput[k].DevActionOutAddr,
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevOutputLoop);
}else{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作包含延时场景准备重新保存,地址:%08X 下标:%d,延时节点:%08X 有涉及到延时设备地址:%08X, 回路:%d",
list_addri,
i,
DevActionInfoi.DevActionOutput[k].DevDlyAddr,
DevActionInfoi.DevActionOutput[k].DevActionOutAddr,
DevActionInfoi.DevActionOutput[k].DevActionOutCfg.DevOutputLoop);
}
}else {
DevActionInfoi.DevActionOutput[k].DevDlyAddr = 0x00; //控制扩展设备未延时的,先清空延时节点。后面再重新遍历,再赋值延时设备信息
}
}
for(k = 0; k < SRAM_DevAction_List_Size; k++)
{
SRAM_Write_Byte(0x00,list_addri+k);
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作因为复用标志置位准备重新保存,地址:%08X", list_addri);
DevActionInfoi.CheckVal = 0x00;
SRAM_DMA_Write_Buff((uint8_t *)&DevActionInfoi, DevActionInfoi.data_len, list_addri); //写入数据
DevActionInfoi.CheckVal = DevAction_CheckSum(list_addri,DevActionInfoi.data_len); //计算整包校验
SRAM_Write_Byte(DevActionInfoi.CheckVal,(list_addri + sizeof(Dev_Action_Core) + sizeof(Dev_Action_Input) + sizeof(Dev_Action_Cond) + sizeof(Dev_Action_State)) ); //校验值重新写入
}
}
/*******************************************************************************
* Function Name : Expand_Scene_Get
* Description : 为控制场景的设备进行地址得到
* 当动作初始化,以及延时链表完成之后,重新遍历动作链表,每个动作中的每个扩展设备,进行赋值
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Expand_Scene_Get(void)
{
uint8_t KeepFlag = 0,CtrlWay = 0;
uint16_t i = 0,j = 0;
uint32_t list_addr = 0;
DEV_ACTION_INFO DevActionInfo;
for(i = 0; i < DevActionGlobal.DevActionNum; i++ )
{
KeepFlag = 0x00;
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);
for(j = 0; j < DevActionInfo.DevCtrlNum; j++)
{
if( DevActionInfo.DevActionOutput[j].DevActionOutCfg.DevType == Dev_Host_Invalid )
{
DevActionInfo.DevActionOutput[j].DevActionOutAddr = DevAction_No_Get(DevActionInfo.DevActionOutput[j].DevActionOutCfg.DevOutputLoop);
if( DevActionInfo.DevActionOutput[j].DevActionOutAddr != 0x00 )
{
KeepFlag = 0x01;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作包含场景,准备重新保存,地址:%08X 场景地址:%08X 下标:%d 回路:%d",
list_addr,DevActionInfo.DevActionOutput[j].DevActionOutAddr,
i,
DevActionInfo.DevActionOutput[j].DevActionOutCfg.DevOutputLoop);
}
}
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: //对应场景
case CFG_Dev_CtrlWay_Is_RelateBlink: //对应闪烁
DevActionInfo.DevActionState.SceneTypeFlag = 0x01;
KeepFlag = 0x01; //当前动作需要重新保存
break;
}
break;
case Dev_NodeCurtain:
if(DEV_CTRLWAY_RELATESCENE == (DevActionInfo.DevActionOutput[i].DevActionOutCfg.DevCtrlState & 0x00ff))
{
KeepFlag = 0x01; //当前动作需要重新保存
DevActionInfo.DevActionState.SceneTypeFlag = 0x01;
}
break;
}
switch(DevActionInfo.DevActionCond.SceneExcute)
{
case ACTION_SCENE_TWO:
case ACTION_SCENE_SLEEP:
case ACTION_SCENE_MAINSWITCH:
case ACTION_SCENE_HELPSLEEP:
KeepFlag = 0x01; //当前动作需要重新保存
DevActionInfo.DevActionState.SceneTypeFlag = 0x01;
break;
}
}
if( KeepFlag == 0x01 )
{
for(uint16_t k = 0;k<SRAM_DevAction_List_Size;k++)
{
SRAM_Write_Byte(0x00,list_addr+k);
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作准备重新保存,地址:%08X", list_addr);
DevActionInfo.CheckVal = 0x00;
SRAM_DMA_Write_Buff((uint8_t *)&DevActionInfo, DevActionInfo.data_len, list_addr); //写入数据
DevActionInfo.CheckVal = DevAction_CheckSum(list_addr,DevActionInfo.data_len); //计算整包校验
SRAM_Write_Byte(DevActionInfo.CheckVal,(list_addr + sizeof(Dev_Action_Core) + sizeof(Dev_Action_Input) + sizeof(Dev_Action_Cond) + sizeof(Dev_Action_State)) ); //校验值重新写入
}
}
}
/*******************************************************************************
* Function Name : Expand_DevDly_Get
* Description : 设备动作数据初始化
* 为不带延时的的扩展设备进行延时节点赋值,为带延时的场景,进行地址赋值。 为控制场景的设备进行地址得到
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Expand_DevDly_Get(void)
{
uint8_t KeepFlag = 0x00;
uint16_t i = 0,j = 0;
uint32_t list_addr = 0;
DEV_ACTION_INFO DevActionInfo;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开始遍历所有的动作 动作个数:%d, 动作的起始地址:%08X",DevActionGlobal.DevActionNum, SRAM_DevAction_List_Start_Addr);
for(i = 0; i < DevActionGlobal.DevActionNum; i++)
{
KeepFlag = 0x00;
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);
for(j = 0; j < DevActionInfo.DevCtrlNum; j++)
{
if( DevActionInfo.DevActionOutput[j].DevActionOutCfg.DevDlyValue.DelayCont == 0x00 )
{
DevActionInfo.DevActionOutput[j].DevDlyAddr = DevDlyAddr_Get(DevActionInfo.DevActionOutput[j].DevActionOutAddr, DevActionInfo.DevActionOutput[j].DevActionOutCfg.DevOutputLoop);
if(DevActionInfo.DevActionOutput[j].DevDlyAddr != 0x00)
{
KeepFlag = 0x01;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作准备重新保存,地址:%08X 下标:%d,延时节点:%08X 有涉及到延时设备地址:%08X, 回路:%d",
list_addr,
i,
DevActionInfo.DevActionOutput[j].DevDlyAddr,
DevActionInfo.DevActionOutput[j].DevActionOutAddr,
DevActionInfo.DevActionOutput[j].DevActionOutCfg.DevOutputLoop);
}
}
}
if(KeepFlag == 0x01)
{
for(uint16_t k = 0;k<SRAM_DevAction_List_Size;k++)
{
SRAM_Write_Byte(0x00,list_addr+k);
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前动作准备重新保存,地址:%08X", list_addr);
DevActionInfo.CheckVal = 0x00; //校验清0再写入
SRAM_DMA_Write_Buff((uint8_t *)&DevActionInfo, DevActionInfo.data_len, list_addr); //写入数据
DevActionInfo.CheckVal = DevAction_CheckSum(list_addr,DevActionInfo.data_len); //计算整包校验
SRAM_Write_Byte(DevActionInfo.CheckVal,(list_addr + sizeof(Dev_Action_Core) + sizeof(Dev_Action_Input) + sizeof(Dev_Action_Cond) + sizeof(Dev_Action_State)));
}
}
}
/*******************************************************************************
* Function Name : BLV_DevAction_AllData_Init
* Description : 设备动作数据初始化
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void BLV_DevAction_AllData_Init(void)
{
memset((void *)&BUS485_Info,0,sizeof(BLV_BUS_Manage_G));
memset(&Poll485_Info,0,sizeof(BLV_POLL_Manage_G));
memset((void *)&Act485_Info,0,sizeof(BLV_ACTIVE_Manage_G));
memset((void *)&NorDevInfoGlobal,0,sizeof(BLV_NORDEV_Manage_G));
memset((void *)&DevActionGlobal,0,sizeof(BLV_DevAction_Manage_G)); //全局参数全部清0
//SRAM_PowerOn_Restore_ParaInfo();
DevAction_CondData_Init(); //动作条件参数数据初始化
LOGIC_FILE_Check();
DevAction_ReuseFlag_Get(); //复用标志置位 触发节点和扩展设备重新得到 带延时的扩展设备 需要新增到设备链表
Expand_DevDly_Get(); /*为不带延时的的扩展设备进行延时节点赋值*/
Dev_Coord_Get(); //拿到设备下标和动作下标
DevActionGlobal.DevLockAddr = Find_AllDevice_List_Information(DEV_RS485_WxLock, DevActionGlobal.Lock485Addr); //
DevActionGlobal.pc_addr = Find_Device_List_Information(DEV_PCTEST_TYPE,DEV_PCTEST_Addr);
}
/*******************************************************************************
* Function Name : Flash_read_Byte
* Description : 从外部SPI Flash中读取一个字节
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t Flash_read_Byte(uint32_t addr)
{
uint8_t data[2] = {0};
Flash_Read(data,1,addr);
return data[0];
}
/*******************************************************************************
* Function Name : Data_Uint8_Convert_To_Uint32
* Description : 将uint8_t 数组转换为uint32_t
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint32_t Data_Uint8_Convert_To_Uint32(uint8_t *data)
{
uint32_t rev_data = 0;
rev_data = data[3];
rev_data <<= 8;
rev_data |= data[2];
rev_data <<= 8;
rev_data |= data[1];
rev_data <<= 8;
rev_data |= data[0];
return rev_data;
}
/*******************************************************************************
* Function Name : Data_Uint8_Convert_To_Uint16
* Description : 将uint8_t 数组转换为uint16_t
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint16_t Data_Uint8_Convert_To_Uint16(uint8_t *data)
{
uint16_t rev_data = 0;
rev_data = data[1];
rev_data<<=8;
rev_data |= data[0];
return rev_data;
}
/*******************************************************************************
* Function Name : Logic_Info_DeviceType_To_String
* Description : 配置逻辑-设备类型转换为字符串
*******************************************************************************/
char device_temp_string[32] = {0};
__attribute__((section(".non_0_wait"))) char *Logic_Info_DeviceType_To_String(uint8_t type)
{
memset(device_temp_string,0,sizeof(device_temp_string));
#if LOGIC_DEBUG_INFO_EN
switch(type)
{
case Dev_Host_Invalid:
strncpy(device_temp_string,(const char *)"场景",sizeof("场景"));
break;
case Dev_Host_HVout:
strncpy(device_temp_string,(const char *)"强电继电器",sizeof("强电继电器"));
break;
case Dev_Host_LVinput:
strncpy(device_temp_string,(const char *)"弱电输入",sizeof("弱电输入"));
break;
case Dev_Host_LVoutput:
strncpy(device_temp_string,(const char *)"弱电输出",sizeof("弱电输出"));
break;
case Dev_Host_Service:
strncpy(device_temp_string,(const char *)"服务信息",sizeof("服务信息"));
break;
case Dev_NodeCurtain:
strncpy(device_temp_string,(const char *)"干节点窗帘",sizeof("干节点窗帘"));
break;
case DEV_RS485_SWT:
strncpy(device_temp_string,(const char *)"开关",sizeof("开关"));
break;
case DEV_RS485_TEMP:
strncpy(device_temp_string,(const char *)"空调",sizeof("空调"));
break;
case DEV_RS485_INFRARED:
strncpy(device_temp_string,(const char *)"红外",sizeof("红外"));
break;
case DEV_RS485_AirDetect:
strncpy(device_temp_string,(const char *)"空气检测",sizeof("空气检测"));
break;
case DEV_RS485_CARD:
strncpy(device_temp_string,(const char *)"插卡取电",sizeof("插卡取电"));
break;
case DEV_RS485_HEATER:
strncpy(device_temp_string,(const char *)"地暖",sizeof("地暖"));
break;
case Dev_RCU_NET:
strncpy(device_temp_string,(const char *)"RCU设备网络",sizeof("RCU设备网络"));
break;
case DEV_RS485_CURTAIN:
strncpy(device_temp_string,(const char *)"窗帘",sizeof("窗帘"));
break;
case DEV_RS485_RELAY:
strncpy(device_temp_string,(const char *)"继电器",sizeof("继电器"));
break;
case DEV_RS485_IR_SEND:
strncpy(device_temp_string,(const char *)"红外发送",sizeof("红外发送"));
break;
case DEV_RS485_DIMMING:
strncpy(device_temp_string,(const char *)"直流调光",sizeof("直流调光"));
break;
case DEV_RS485_TRAIC:
strncpy(device_temp_string,(const char *)"可控硅调光",sizeof("可控硅调光"));
break;
case DEV_RS485_STRIP:
strncpy(device_temp_string,(const char *)"灯带",sizeof("灯带"));
break;
case DEV_RS485_CoreCtrl:
strncpy(device_temp_string,(const char *)"中控",sizeof("中控"));
break;
case DEV_RS485_WxLock:
strncpy(device_temp_string,(const char *)"微信锁",sizeof("微信锁"));
break;
case DEV_RS485_MUSIC:
strncpy(device_temp_string,(const char *)"背景音乐",sizeof("背景音乐"));
break;
case DEV_NET_ROOMSTATE:
strncpy(device_temp_string,(const char *)"房态下发",sizeof("房态下发"));
break;
case Dev_Host_PWMLight:
strncpy(device_temp_string,(const char *)"主机本地调光",sizeof("主机本地调光"));
break;
case DEV_RS485_PWM:
strncpy(device_temp_string,(const char *)"485PWM调光",sizeof("485PWM调光"));
break;
case DEV_PB_LED:
strncpy(device_temp_string,(const char *)"总线调光",sizeof("总线调光"));
break;
case DEV_RCU_POWER:
strncpy(device_temp_string,(const char *)"RCU电源",sizeof("RCU电源"));
break;
case DEV_RS485_A9_IO_SWT:
strncpy(device_temp_string,(const char *)"A9IO开关",sizeof("A9IO开关"));
break;
case DEV_RS485_A9_IO_EXP:
strncpy(device_temp_string,(const char *)"A9IO扩展",sizeof("A9IO扩展"));
break;
case DEV_RS485_A9_IO_POWER:
strncpy(device_temp_string,(const char *)"A9IO电源",sizeof("A9IO电源"));
break;
case DEV_RS485_RFGatewayCycle:
strncpy(device_temp_string,(const char *)"无线网关轮询",sizeof("无线网关轮询"));
break;
case DEV_RS485_RFGatewayHost:
strncpy(device_temp_string,(const char *)"无线网关主动",sizeof("无线网关主动"));
break;
case DEV_RS485_RFGatewayDoor:
strncpy(device_temp_string,(const char *)"无线门磁",sizeof("无线门磁"));
break;
case DEV_RS485_AirReveal:
strncpy(device_temp_string,(const char *)"空气参数显示",sizeof("空气参数显示"));
break;
case DEV_RS485_RFGatewayRelayPir:
strncpy(device_temp_string,(const char *)"无线继电器红外",sizeof("无线继电器红外"));
break;
case Dev_Host_TimeCtrl:
strncpy(device_temp_string,(const char *)"时间同步",sizeof("时间同步"));
break;
case Dev_Rs458_MonitorCtrl:
strncpy(device_temp_string,(const char *)"监控控制",sizeof("监控控制"));
break;
case Dev_Rs458_RotaryCtrl:
strncpy(device_temp_string,(const char *)"旋钮开关控制",sizeof("旋钮开关控制"));
break;
case Dev_BUS_C5IO:
strncpy(device_temp_string,(const char *)"BLV_CSIO",sizeof("BLV_CSIO"));
break;
}
#endif
return device_temp_string;
}
/*******************************************************************************
* Function Name : Logic_Info_DevicePort_To_String
* Description : 配置逻辑-设备端口转换为字符串
*******************************************************************************/
__attribute__((section(".non_0_wait"))) char *Logic_Info_DevicePort_To_String(uint8_t type)
{
memset(device_temp_string,0,sizeof(device_temp_string));
#if LOGIC_DEBUG_INFO_EN
switch(type)
{
case Polling_Port:
strncpy(device_temp_string,(const char *)"Polling_Port",sizeof("Polling_Port"));
break;
case Active_Port:
strncpy(device_temp_string,(const char *)"Active_Port",sizeof("Active_Port"));
break;
case Bus_port:
strncpy(device_temp_string,(const char *)"Bus_port",sizeof("Bus_port"));
break;
}
#endif
return device_temp_string;
}
/*******************************************************************************
* Function Name : Logic_Info_DeviceAction_Condition_To_String
* Description : 配置逻辑-动作条件转换为字符串
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_Info_DeviceAction_Condition_To_String(uint8_t *data)
{
LOGIC_ACTIVE_CONDITION_G temp_condition;
memset(&temp_condition,0,sizeof(LOGIC_ACTIVE_CONDITION_G));
memcpy((char *)&temp_condition,(const char *)data,sizeof(LOGIC_ACTIVE_CONDITION_G));
#if LOGIC_DEBUG_INFO_EN
switch(temp_condition.DevActionOutFlag) //动作输出使能
{
case 0x00: //正常
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作输出使能 - 正常");
break;
case 0x01: //锁定
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作输出使能 - 锁定");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作输出使能 - Error:%d",temp_condition.DevActionOutFlag);
break;
}
switch(temp_condition.RoomState) //房态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"房态 - 不判断");
break;
case 0x01: //出租
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"房态 - 出租");
break;
case 0x02: //退房
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"房态 - 退房");
break;
case 0x03: //待租
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"房态 - 待租");
break;
case 0x04: //空房
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"房态 - 空房");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"房态 - Error:%d",temp_condition.RoomState);
break;
}
switch(temp_condition.EleCtrlFlag) //取电服务控制
{
case 0x00: //不执行
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"取电服务控制 - 不执行");
break;
case 0x01: //执行
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"取电服务控制 - 执行");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"取电服务控制 - Error:%d",temp_condition.EleCtrlFlag);
break;
}
switch(temp_condition.EleState) //取电状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"取电状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"取电状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"取电状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"取电状态 - Error:%d",temp_condition.EleState);
break;
}
switch(temp_condition.DndState) //勿扰状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"勿扰状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"勿扰状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"勿扰状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"勿扰状态 - Error:%d",temp_condition.DndState);
break;
}
switch(temp_condition.CleanState) //清理状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"清理状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"清理状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"清理状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"清理状态 - Error:%d",temp_condition.CleanState);
break;
}
switch(temp_condition.CallState) //呼叫状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"呼叫状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"呼叫状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"呼叫状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"呼叫状态 - Error:%d",temp_condition.CallState);
break;
}
switch(temp_condition.WashState) //洗衣状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"洗衣状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"洗衣状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"洗衣状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"洗衣状态 - Error:%d",temp_condition.WashState);
break;
}
switch(temp_condition.CheckOutState) //退房状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退房状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退房状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退房状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"退房状态 - Error:%d",temp_condition.CheckOutState);
break;
}
switch(temp_condition.WaitState) //稍后状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"稍后状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"稍后状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"稍后状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"稍后状态 - Error:%d",temp_condition.WaitState);
break;
}
switch(temp_condition.SosState) //SOS状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"SOS状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"SOS状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"SOS状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"SOS状态 - Error:%d",temp_condition.SosState);
break;
}
switch(temp_condition.RentState) //预约待租状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"预约待租状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"预约待租状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"预约待租状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"预约待租状态 - Error:%d",temp_condition.RentState);
break;
}
switch(temp_condition.LockState) //开锁状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开锁状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开锁状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开锁状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"开锁状态 - Error:%d",temp_condition.LockState);
break;
}
switch(temp_condition.LuggageState) //行李状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"行李状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"行李状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"行李状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"行李状态 - Error:%d",temp_condition.LuggageState);
break;
}
switch(temp_condition.StrongState) //保险箱状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"保险箱状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"保险箱状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"保险箱状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"保险箱状态 - Error:%d",temp_condition.StrongState);
break;
}
switch(temp_condition.DoorState) //门磁状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"门磁状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"门磁状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"门磁状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"门磁状态 - Error:%d",temp_condition.DoorState);
break;
}
switch(temp_condition.WarningState) //提示音状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"提示音状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"提示音状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"提示音状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"提示音状态 - Error:%d",temp_condition.WarningState);
break;
}
switch(temp_condition.BacklightState) //背光状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"背光状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"背光状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"背光状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"背光状态 - Error:%d",temp_condition.BacklightState);
break;
}
switch(temp_condition.SeasonState) //季节
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"季节 - 不判断");
break;
case 0x01: //春
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"季节 - 春");
break;
case 0x02: //夏
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"季节 - 夏");
break;
case 0x03: //秋
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"季节 - 秋");
break;
case 0x04: //冬
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"季节 - 冬");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"季节 - Error:%d",temp_condition.SeasonState);
break;
}
switch(temp_condition.TimeState) //时间
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"时间 - 不判断");
break;
case 0x01: //全天
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"时间 - 全天");
break;
case 0x02: //白天
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"时间 - 白天");
break;
case 0x03: //黑夜
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"时间 - 黑夜");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"时间 - Error:%d",temp_condition.TimeState);
break;
}
switch(temp_condition.NeightState) //起夜状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"起夜状态 - 不判断");
break;
case 0x01: //开
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"起夜状态 - 开");
break;
case 0x02: //关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"起夜状态 - 关");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"起夜状态 - Error:%d",temp_condition.NeightState);
break;
}
switch(temp_condition.RcuLockState) //锁定状态
{
case 0x00: //不判断
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"锁定状态 - 不判断");
break;
case 0x01: //锁定
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"锁定状态 - 锁定");
break;
case 0x02: //正常
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"锁定状态 - 正常");
break;
default:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"锁定状态 - Error:%d",temp_condition.RcuLockState);
break;
}
#endif
}
/*******************************************************************************
* Function Name : Logic_FrameType_LogicInfo_TempProcessing
* Description : 逻辑文件中 - 逻辑信息 临时处理
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_LogicInfo_TempProcessing(uint8_t *data,uint16_t len)
{
uint16_t temp_len = 0;
uint32_t temp_data = 0;
char temp_str[36];
memset(temp_str,0,sizeof(temp_str));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
// #if LOGIC_DEBUG_INFO_EN
strncpy(temp_str,(const char *)&data[temp_len],32);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑发布作者:%s",temp_str);
temp_len += 32;
memcpy(temp_str,&data[temp_len],4);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"配置软件版本:%d-%d-%d-%d",temp_str[0],temp_str[1],temp_str[2],temp_str[3]);
temp_len += 4;
strncpy(temp_str,(const char *)&data[temp_len],7);
temp_data = temp_str[0]*256+temp_str[1];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑发布时间: %04d-%02d-%02d %02d:%02d:%02d \r\n",temp_data,temp_str[2],temp_str[3],temp_str[4],temp_str[5],temp_str[6]);
temp_len += 7;
strncpy(temp_str,(const char *)&data[temp_len],32);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"项目名称:%s",temp_str);
temp_len += 32;
temp_data = Data_Uint8_Convert_To_Uint32(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"项目编号:%d",temp_data);
temp_len += 4;
strncpy(temp_str,(const char *)&data[temp_len],32);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"项目分组:%s",temp_str);
temp_len += 32;
strncpy(temp_str,(const char *)&data[temp_len],32);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"房型别名:%s",temp_str);
temp_len += 32;
strncpy(temp_str,(const char *)&data[temp_len],3);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑数据版本:%d-%d-%d",temp_str[0],temp_str[1],temp_str[2]);
temp_len += 3;
//机型名称 - 64Byte
// strncpy(temp_str,(const char *)&data[temp_len],3);
// Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑数据版本:%d-%d-%d",temp_str[0],temp_str[1],temp_str[2]);
temp_len += 64;
//时间偏移量 - 2Byte
g_time_info.timezone = data[temp_len+1];
g_time_info.timezone <<= 8;
g_time_info.timezone |= data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"时区偏移量:%d",g_time_info.timezone);
// #endif
}
/*******************************************************************************
* Function Name : Read_LogicFile_Information
* Description : 读取逻辑文件信息 -
这个在Flash存储第一条数据便是这数据信息 - 有就有,没有那就没有
特别注意传递进来的buff数组够大否则会导致数组越界
* Input :
select :
0x00:查询全部信息
0x01:查询发布作者 - 32Byte
0x02:查询软件版本 - 4Byte
0x03:查询发布时间 - 7Byte
0x04:查询酒店名称 - 32Byte
0x05:查询酒店代号 - 4Byte
0x06:查询项目分组 - 32Byte
0x07:查询房型别名 - 32Byte
0x08:查询版本号 - 3Byte
buff :存放数据地址
* Return :
0x00查询成功
0x01查询失败
*******************************************************************************/
#define LogicFile_InfoDetails_Len 0x92
#define LogicFile_InfoDetails_Author_Offset 0x0000 //发布作者 - 32Byte
#define LogicFile_Infodetails_SWVersion_Offset 0x0020 //软件版本 - 4Byte
#define LogicFile_Infodetails_ReleaseDate_Offset 0x0026 //发布时间 - 7Byte
#define LogicFile_Infodetails_HotelName_Offset 0x002B //酒店名称 - 32Byte
#define LogicFile_Infodetails_HotelCode_Offset 0x004B //酒店代号 - 4Byte
#define LogicFile_Infodetails_HotelGroupName_Offset 0x004F //项目分组 - 32Byte
#define LogicFile_Infodetails_HomeName_Offset 0x006F //房型别名 - 32Byte
#define LogicFile_Infodetails_Version_Offset 0x008F //版本号 - 3Byte
__attribute__((section(".non_0_wait"))) uint8_t Read_LogicFile_Information(uint8_t select,uint8_t *buff)
{
uint32_t temp = 0,file_len = 0;
uint8_t md5[16];
uint8_t file_info[30];
uint8_t rev= 0x01;
memset(file_info,0,sizeof(file_info));
memset(md5,0,sizeof(md5));
/*1、先读取逻辑文件标志位*/
Flash_Read(file_info,24,SPIFLASH_LOGIC_DataFlag_ADDRESS);
temp = file_info[3];
temp <<= 8;
temp |= file_info[2];
temp <<= 8;
temp |= file_info[1];
temp <<= 8;
temp |= file_info[0];
if(temp != LOGIC_DataFlag)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件标志位不符,不作处理:%08X",temp);
return 0x01;
}
file_len = file_info[7];
file_len <<= 8;
file_len |= file_info[6];
file_len <<= 8;
file_len |= file_info[5];
file_len <<= 8;
file_len |= file_info[4];
if((file_len != 0x00) &&(file_len > 0x70000))
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件长度不对:%08X",file_len);
return 0x01;
}
MD5Digest_FLASH(SPIFLASH_LOGIC_DataStart_ADDRESS, file_len,(char *)&md5[0]);
if(0==strncmp((const char *)md5,(const char *)&file_info[8],16))
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验成功!");
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验错误不作处理 Len:%08X",file_len);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"升级配置失败Md5错误:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X%02X,%02X,%02X,%02X,%02X,%02X",md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"File Md5:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X",\
file_info[8],file_info[9],\
file_info[10],file_info[11],\
file_info[12],file_info[13],\
file_info[14],file_info[15],\
file_info[16],file_info[17],\
file_info[18],file_info[19],\
file_info[21],file_info[21],\
file_info[22],file_info[23]);
/*擦除Flash中的配置文件标志位和MD5值*/
memset(file_info,0,sizeof(file_info));
Flash_Write(file_info,24,SPIFLASH_LOGIC_DataFlag_ADDRESS);
return 0x01;
}
if((Flash_read_Byte(SPIFLASH_LOGIC_DataStart_ADDRESS+Logic_D_Hear_L) == 0xCC) && (Flash_read_Byte(SPIFLASH_LOGIC_DataStart_ADDRESS+Logic_D_Hear_H) == 0xC0))
{
uint8_t temp_data[4];
uint16_t temp_len = 0;
Flash_Read(temp_data,4,SPIFLASH_LOGIC_DataStart_ADDRESS+Logic_D_Len_L);
temp_len = temp_data[1];
temp_len <<= 8;
temp_len |= temp_data[0];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"找到文件,读取数据长度:%d",temp_len);
if((temp_len <= file_len) && (temp_len <= 1024)) //目前包长最大1024
{
uint16_t temp_crc = 0,data_crc = 0;
uint16_t data_frame = 0,data_sn = 0;
uint8_t temp_buff[temp_len];
memset(temp_buff,0,sizeof(temp_buff));
Flash_Read(temp_buff,temp_len,SPIFLASH_LOGIC_DataStart_ADDRESS);
temp_crc = NetCRC16_Data(temp_buff ,temp_len,Logic_D_CRC_L);
data_crc = temp_buff[Logic_D_CRC_H];
data_crc <<= 8;
data_crc |= temp_buff[Logic_D_CRC_L];
if(data_crc == temp_crc)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
data_frame = temp_buff[Logic_D_FrameNum_H];
data_frame <<= 8;
data_frame |= temp_buff[Logic_D_FrameNum_L];
data_sn = temp_buff[Logic_D_Frame_H];
data_sn <<= 8;
data_sn |= temp_buff[Logic_D_Frame_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
Dbg_Print_Buff(DBG_BIT_LOGIC_STATUS_bit,"逻辑帧数据" ,temp_buff,temp_len);
if(temp_buff[Logic_D_FrameType] == Logic_FrameType_LogicInfo)
{
switch(select)
{
case 0x00: //查询全部信息
memcpy(buff,&temp_buff[Logic_D_Para],LogicFile_InfoDetails_Len);
rev = 0x00;
break;
case 0x01: //查询发布作者 - 32Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_InfoDetails_Author_Offset],32);
rev = 0x00;
break;
case 0x02: //查询软件版本 - 4Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_Infodetails_SWVersion_Offset],4);
rev = 0x00;
break;
case 0x03: //查询发布时间 - 7Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_Infodetails_ReleaseDate_Offset],7);
rev = 0x00;
break;
case 0x04: //查询酒店名称 - 32Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_Infodetails_HotelName_Offset],32);
rev = 0x00;
break;
case 0x05: //查询酒店代号 - 4Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_Infodetails_HotelCode_Offset],4);
rev = 0x00;
break;
case 0x06: //查询项目分组 - 32Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_Infodetails_HotelGroupName_Offset],32);
rev = 0x00;
break;
case 0x07: //查询房型别名 - 32Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_Infodetails_HomeName_Offset],32);
rev = 0x00;
break;
case 0x08: //查询版本号 - 3Byte
memcpy(buff,&temp_buff[Logic_D_Para + LogicFile_Infodetails_Version_Offset],3);
rev = 0x00;
break;
}
}
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验失败!");
}
}else{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"读取数据长度不在范围内:%08X - %d",temp_len);
}
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"不是逻辑文件数据包头!%02X %02X",Flash_read_Byte(SPIFLASH_LOGIC_DataStart_ADDRESS+Logic_D_Hear_L) , Flash_read_Byte(SPIFLASH_LOGIC_DataStart_ADDRESS+Logic_D_Hear_H));
}
return rev;
}
/*******************************************************************************
* Function Name : Logic_FrameType_Global_TempProcessing
* Description : 逻辑文件中 - 全局信息 临时处理
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_Global_TempProcessing(uint8_t *data,uint16_t len)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
}
/*******************************************************************************
* Function Name : Logic_FrameType_DeviceAction_TempProcessing
* Description : 逻辑文件中 - 设备存在协议支持判断
* Input :
* Return :
0x00 :有对应的协议
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t Logic_DeviceType_Legal_Judgment(LOGICFILE_DEVICE_INFO *dev_info)
{
uint8_t rev = 0x01;
switch(dev_info->type)
{
case Dev_Host_Invalid: //场景
if((dev_info->version == 0x00) && (dev_info->port == 0x00)) rev = 0x00;
break;
case Dev_Host_HVout: //强电继电器
if((dev_info->version == 0x01) && (dev_info->port == Bus_port)) rev = 0x00; //BLV_Cx主机继电器
else if((dev_info->version == 0x02) && (dev_info->port == Polling_Port)) rev = 0x00; //A9IO继电器
else if((dev_info->version == 0x03) && (dev_info->port == Active_Port)) rev = 0x00; //强电开关
break;
case Dev_Host_LVinput: //弱电输入
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //BLV_Cx主机弱电输入 - 普通设备
else if((dev_info->version == 0x02) && (dev_info->port == Polling_Port)) rev = 0x00; //485红外感应
else if((dev_info->version == 0x03) && (dev_info->port == Active_Port)) rev = 0x00; //6路弱电输入
break;
case Dev_Host_LVoutput: //弱电输出
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //BLV_Cx主机弱电输出 - 普通设备
break;
case Dev_Host_Service: //服务信息
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //服务信息设备
break;
case Dev_NodeCurtain: //干接点窗帘
if((dev_info->version == 0x00) && (dev_info->port == 0x00)) rev = 0x00; //干接点窗帘设备
break;
case DEV_RS485_SWT: //开关
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //T1触摸开关
else if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //C7T/C43开关
else if((dev_info->version == 0x03) && (dev_info->port == Polling_Port)) rev = 0x00; //A9IO开关
break;
case DEV_RS485_TEMP: //空调
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //T1温控器
else if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //C7T/C43温控器
else if((dev_info->version == 0x03) && (dev_info->port == Polling_Port)) rev = 0x00; //T1四管温控器
else if((dev_info->version == 0x04) && (dev_info->port == Active_Port)) rev = 0x00; //T1主动温控器
break;
case DEV_RS485_INFRARED: //红外
//这个设备暂时没有对接
break;
case DEV_RS485_AirDetect: //空气检测
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //M702空气质量检测
break;
case DEV_RS485_CARD: //插卡取电
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //BLW插卡取电轮训
else if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //BLW插卡取电(主动)
break;
case DEV_RS485_HEATER: //地暖
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //宝来威地暖
if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //CLED地暖
break;
case Dev_RCU_NET: //RCU设备网络
//这个设备暂时没有对接
break;
case DEV_RS485_CURTAIN: //485窗帘
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //杜亚窗帘
if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //丙申窗帘
break;
case DEV_RS485_RELAY: //继电器
//这个设备预计取消
break;
case DEV_RS485_IR_SEND: //红外发送
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //轮训红外转发设备
if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //主动红外转发设备
break;
case DEV_RS485_DIMMING: //直流调光
//这个设备预计取消 - 合并到485PWM调光中
break;
case DEV_RS485_TRAIC: //可控硅调光
//这个设备预计取消 - 合并到485PWM调光中
break;
case DEV_RS485_STRIP: //灯带
// if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //合并到PWM调光里面
break;
case DEV_RS485_CoreCtrl: //中控
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //小宝语音
break;
case DEV_RS485_WxLock: //微信锁
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //BLW微信锁
else if((dev_info->version == 0x02) && (dev_info->port == Polling_Port)) rev = 0x00; //福瑞狗微信锁
else if((dev_info->version == 0x03) && (dev_info->port == Polling_Port)) rev = 0x00; //创佳微信锁
break;
case DEV_RS485_MUSIC: //背景音乐
if((dev_info->version == 0x01) && (dev_info->port == Bus_port)) rev = 0x00; //BLV_Cx背景音乐
else if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //BLW背景音乐和小宝音乐
else if((dev_info->version == 0x06) && (dev_info->port == Polling_Port)) rev = 0x00; //华尔思音乐
break;
case DEV_NET_ROOMSTATE: //房态下发
//这个设备暂时没有对接
break;
case Dev_Host_PWMLight: //主机本地调光
//这个设备预计取消
break;
case DEV_RS485_PWM: //485PWM调光
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //PWM调光
else if((dev_info->version == 0x02) && (dev_info->port == Polling_Port)) rev = 0x00; //A9LD调光
else if((dev_info->version == 0x03) && (dev_info->port == Active_Port)) rev = 0x00; //C7T滑动条调光
else if((dev_info->version == 0x04) && (dev_info->port == Polling_Port)) rev = 0x00; //A8PB调光
else if((dev_info->version == 0x05) && (dev_info->port == Bus_port)) rev = 0x00; //C12调光
else if((dev_info->version == 0x06) && (dev_info->port == Polling_Port)) rev = 0x00; //宝来威灯带调光
break;
case DEV_PB_LED: //总线调光
//这个设备预计取消
break;
case DEV_RCU_POWER: //RCU电源
//这个设备预计取消
break;
case DEV_RS485_A9_IO_SWT: //A9IO开关
//这个设备预计取消
break;
case DEV_RS485_A9_IO_EXP: //A9IO扩展
//这个设备预计取消
break;
case DEV_RS485_A9_IO_POWER: //A9IO电源
//这个设备预计取消
break;
case DEV_RS485_RFGatewayCycle: //无线网关轮询
//这个设备预计取消
break;
case DEV_RS485_RFGatewayHost: //无线网关主动
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //RF主网关
break;
case DEV_RS485_RFGatewayDoor: //无线门磁
//这个设备预计取消
break;
case DEV_RS485_AirReveal: //空气参数显示
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //C7T空气质量显示
break;
case DEV_RS485_RFGatewayRelayPir: //无线继电器红外
//这个设备预计取消
break;
case Dev_Host_TimeCtrl: //时间同步
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //C7T时间同步
break;
case Dev_Rs458_MonitorCtrl: //监控控制
//这个设备预计取消
break;
case Dev_Rs458_RotaryCtrl: //旋钮开关控制
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //旋钮开关 协议1
if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //旋钮开关 协议2
break;
case Dev_BUS_C5IO: //BLV_CSIO
if((dev_info->version == 0x01) && (dev_info->port == Bus_port)) rev = 0x00; //BLV_CxIO设备
break;
case Dev_RS485_CardState:
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //主动端口插卡同步
if((dev_info->version == 0x02) && (dev_info->port == Polling_Port)) rev = 0x00; //轮询端口插卡同步
break;
case DEV_RS485_FreshAir: //485新风
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //宝来威新风
if((dev_info->version == 0x02) && (dev_info->port == Active_Port)) rev = 0x00; //CLED新风
break;
case DEV_RS485_LCD: //LCD1602
if((dev_info->version == 0x01) && (dev_info->port == Bus_port)) rev = 0x00; //LCD1602
break;
case Dev_Rs485_PB20:
if((dev_info->version == 0x01) && (dev_info->port == Bus_port)) rev = 0x00; //PB20
break;
case Dev_Rs485_PB20_LD:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //PB20_LED
break;
case Dev_Rs485_PB20_LS:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //PB20_LightStrip
break;
case Dev_Rs485_PB20_Relay:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //PB20_Relay
break;
case DEV_Virtual_NoCard:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //虚拟断电设备
break;
case DEV_Virtual_Card:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //虚拟无卡取电设备
break;
case DEV_Virtual_ColorTemp:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //色温调节
break;
#if Dev_485_BLE_Music_Flag
case Dev_485_BLE_Music:
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //蓝牙音频
break;
#endif
#if Dev_Nor_Carbon_Flag
case DEV_Carbon_Saved:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //碳达人
break;
#endif
#if Dev_Nor_Scene_Restore_Flag
case Dev_Scene_Restore:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //场景还原
break;
#endif
#if Dev_Nor_GlobalSet_Flag //2025-07-15,YYW,全局设置
case Dev_Virtual_GlobalSet:
if((dev_info->version == 0x01) && (dev_info->port == 0x00)) rev = 0x00; //全局设置
break;
#endif
case Dev_Energy_Monitor:
if((dev_info->version == 0x01) && (dev_info->port == Polling_Port)) rev = 0x00; //能耗监测
if((dev_info->version == 0x01) && (dev_info->port == Active_Port)) rev = 0x00; //能耗监测
break;
}
return rev;
}
/*******************************************************************************
* Function Name : Logic_FrameType_DeviceExist_TempProcessing
* Description : 逻辑文件中 - 设备存在 临时处理
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_DeviceExist_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
uint32_t temp_len = 0;
char temp_str[38] = {0};
LOGICFILE_DEVICE_INFO temp_dev_info;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
memcpy(&temp_dev_info,data,sizeof(LOGICFILE_DEVICE_INFO));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备类型:%d - %s",temp_dev_info.type,Logic_Info_DeviceType_To_String(temp_dev_info.type));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备地址:%d",temp_dev_info.addr);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备端口:%d - %s",temp_dev_info.port,Logic_Info_DevicePort_To_String(temp_dev_info.port));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备波特率:%d",temp_dev_info.baud);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备协议版本:%d",temp_dev_info.version);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备通讯重发次数:%d",temp_dev_info.retry);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备通讯等待时间:%dms",temp_dev_info.writ_time);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备输入回路数:%d",temp_dev_info.input_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备输出回路数:%d",temp_dev_info.output_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"父设备类型:%d",temp_dev_info.parent_type);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"父设备地址:%d",temp_dev_info.parent_addr);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"父设备端口:%d",temp_dev_info.parent_port);
temp_len += sizeof(LOGICFILE_DEVICE_INFO);
if((temp_len + temp_dev_info.input_num*4 + temp_dev_info.output_num*32) > len)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备输出回路别名长度不对:%d - %d",temp_len + temp_dev_info.input_num*4 + temp_dev_info.output_num*16,len);
}
/*输入回路设置信息 - 输入回路*4Byte*/
temp_len += temp_dev_info.input_num*4;
/*输出回路别名 - 输出回路*32Byte 2022-06-07 将别名长度改为32Byte*/
for(uint16_t i=0;i<temp_dev_info.output_num;i++)
{
memcpy(temp_str,&data[temp_len],32);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备输出回路:%d - %s",i+1,temp_str);
temp_len += 32;
}
Lfile_info->device_num += 1;
switch(temp_dev_info.port)
{
case Bus_port:
if(Logic_DeviceType_Legal_Judgment(&temp_dev_info) == 0x00) {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"该设备有对应处理协议--");
if(Lfile_info->Bus_device_num < BusDevice_NumMax)
{
Lfile_info->Bus_device_addr[Lfile_info->Bus_device_num] = data_addr;
Lfile_info->Bus_device_num += 1;
}
}
break;
case Polling_Port:
if(Logic_DeviceType_Legal_Judgment(&temp_dev_info) == 0x00){
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"该设备有对应处理协议--");
if(Lfile_info->Polling_device_num < PollingDevice_NumMax)
{
Lfile_info->Polling_device_addr[Lfile_info->Polling_device_num] = data_addr;
Lfile_info->Polling_device_num += 1;
}
}
break;
case Active_Port:
if(Logic_DeviceType_Legal_Judgment(&temp_dev_info) == 0x00){
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"该设备有对应处理协议--");
if(Lfile_info->Active_device_num < ActiveDevice_NumMax)
{
Lfile_info->Active_device_addr[Lfile_info->Active_device_num] = data_addr;
Lfile_info->Active_device_num += 1;
}
}
break;
case 0x00: //特殊设备 - 普通设备
if(Logic_DeviceType_Legal_Judgment(&temp_dev_info) == 0x00){
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"该设备有对应处理协议--");
if(Lfile_info->Nor_device_num < NorDevice_NumMax)
{
Lfile_info->Nor_device_addr[Lfile_info->Nor_device_num] = data_addr;
Lfile_info->Nor_device_num += 1;
}
}
break;
default:
break;
}
}
__attribute__((section(".non_0_wait"))) char *Logic_Device_DelayUnit_To_String(uint8_t type)
{
memset(device_temp_string,0,sizeof(device_temp_string));
#if LOGIC_DEBUG_INFO_EN
switch(type)
{
case 0x01:
strncpy(device_temp_string,(const char *)"ms",sizeof("ms"));
break;
case 0x02:
strncpy(device_temp_string,(const char *)"s",sizeof("s"));
break;
case 0x03:
strncpy(device_temp_string,(const char *)"min",sizeof("min"));
break;
}
#endif
return device_temp_string;
}
__attribute__((section(".non_0_wait"))) char *Logic_Data_Service_Info_To_String(uint8_t id)
{
memset(device_temp_string,0,sizeof(device_temp_string));
#if LOGIC_DEBUG_INFO_EN
switch(id)
{
case 0x01:
strncpy(device_temp_string,(const char *)"入住服务",sizeof("入住服务"));
break;
case 0x02:
strncpy(device_temp_string,(const char *)"勿扰服务",sizeof("勿扰服务"));
break;
case 0x03:
strncpy(device_temp_string,(const char *)"清理服务",sizeof("清理服务"));
break;
case 0x04:
strncpy(device_temp_string,(const char *)"呼叫服务",sizeof("呼叫服务"));
break;
case 0x05:
strncpy(device_temp_string,(const char *)"洗衣服务",sizeof("洗衣服务"));
break;
case 0x06:
strncpy(device_temp_string,(const char *)"退房服务",sizeof("退房服务"));
break;
case 0x07:
strncpy(device_temp_string,(const char *)"稍后服务",sizeof("稍后服务"));
break;
case 0x08:
strncpy(device_temp_string,(const char *)"SOS服务",sizeof("SOS服务"));
break;
case 0x09:
strncpy(device_temp_string,(const char *)"送餐服务",sizeof("送餐服务"));
break;
case 0x0A:
strncpy(device_temp_string,(const char *)"开锁服务",sizeof("开锁服务"));
break;
case 0x0B:
strncpy(device_temp_string,(const char *)"行李服务",sizeof("行李服务"));
break;
case 0x0C:
strncpy(device_temp_string,(const char *)"保险箱服务",sizeof("保险箱服务"));
break;
case 0x0D:
strncpy(device_temp_string,(const char *)"门磁服务",sizeof("门磁服务"));
break;
default:
strncpy(device_temp_string,(const char *)"自定义服务",sizeof("自定义服务"));
break;
}
#endif
return device_temp_string;
}
__attribute__((section(".non_0_wait"))) char *Logic_Data_Music_folder_To_String(uint8_t id)
{
memset(device_temp_string,0,sizeof(device_temp_string));
#if LOGIC_DEBUG_INFO_EN
switch(id)
{
case BLV_C5MUSIC_Music_Dir:
strncpy(device_temp_string,(const char *)"音乐",sizeof("音乐"));
break;
case BLV_C5MUSIC_Warning_Dir:
strncpy(device_temp_string,(const char *)"提示音",sizeof("提示音"));
break;
case BLV_C5MUSIC_Helpsleep_Dir:
strncpy(device_temp_string,(const char *)"助眠",sizeof("助眠"));
break;
case BLV_C5MUSIC_Doorbell_Dir:
strncpy(device_temp_string,(const char *)"门铃",sizeof("门铃"));
break;
case BLV_C5MUSIC_Greet_Dir:
strncpy(device_temp_string,(const char *)"欢迎词",sizeof("欢迎词"));
break;
case BLV_C5MUSIC_Helpsleep1_Dir:
strncpy(device_temp_string,(const char *)"助眠冥想",sizeof("助眠冥想"));
break;
case BLV_C5MUSIC_Helpsleep2_Dir:
strncpy(device_temp_string,(const char *)"助眠海浪",sizeof("助眠海浪"));
break;
case BLV_C5MUSIC_Helpsleep3_Dir:
strncpy(device_temp_string,(const char *)"助眠森林",sizeof("助眠森林"));
break;
default:
strncpy(device_temp_string,(const char *)"未知文件夹",sizeof("未知文件夹"));
break;
}
#endif
return device_temp_string;
}
/*******************************************************************************
* Function Name : Logic_FrameType_DeviceAction_TempProcessing
* Description : 逻辑文件中 - 设备动作数据解析 - 8Byte
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_Device_Action_Data_Analysis(uint8_t *data)
{
#if LOGIC_DEBUG_INFO_EN
LOGIC_DEVICE_ACTIVE_G temp_active;
memcpy(&temp_active,data,sizeof(LOGIC_DEVICE_ACTIVE_G));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"****************************");
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制设备类型:%d - %s",temp_active.type,Logic_Info_DeviceType_To_String(temp_active.type));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制设备地址:%d",temp_active.addr);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制回路:%d",temp_active.loop);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制设备执行方式:%d",temp_active.execute);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制设备执行内容:%d",temp_active.content);
Dbg_Print(DBG_BIT_LOGIC_STATUS_bit,"控制动作详细解析:",temp_active.addr);
switch(temp_active.type)
{
case Dev_Host_Invalid:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误\r\n");
break;
}
break;
case Dev_Host_HVout:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误\r\n");
break;
}
break;
case Dev_Host_LVinput:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"弱电输入没有控制内容\r\n");
break;
case Dev_Host_LVoutput:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 调光亮度值:%d\r\n",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 调光亮度值:%d\r\n",temp_active.content);
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"对应场景 调光亮度值:%d\r\n",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误\r\n");
break;
}
break;
case Dev_Host_Service:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"%s ",Logic_Data_Service_Info_To_String(temp_active.loop));
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误\r\n");
break;
}
break;
case Dev_NodeCurtain:
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"窗帘开\r\n",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"窗帘关\r\n",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误\r\n");
break;
}
break;
case DEV_RS485_SWT:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开关背光回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 调光亮度值:%d\r\n",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 调光亮度值:%d\r\n",temp_active.content);
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"与场景有关 调光亮度值:%d\r\n",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误\r\n");
break;
}
break;
case DEV_RS485_TEMP:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"空调控制状态:");
{
uint8_t temp_1 = 0;
uint8_t tempstate = temp_active.execute;
temp_1 = (tempstate >> 6) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开机 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关机");
break;
}
temp_1 = (tempstate >> 4) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"制冷 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"制热 ");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"送风 ");
break;
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"自动 ");
break;
}
temp_1 = (tempstate >> 2) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"低速 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"中速 ");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"高速 ");
break;
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"自动 ");
break;
}
temp_1 = (tempstate >> 0) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"低速 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"中速 ");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"高速 ");
break;
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"自动 ");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"设置温度:%d\r\n",temp_active.content);
}
break;
case DEV_RS485_INFRARED:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"红外感应没有控制内容\r\n");
break;
case DEV_RS485_AirDetect:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"空气检测没有控制内容\r\n");
break;
case DEV_RS485_CARD:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"插卡取电没有控制内容\r\n");
break;
case DEV_RS485_HEATER:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"地暖控制状态:");
{
uint8_t temp_1 = 0;
uint8_t tempstate = temp_active.execute;
temp_1 = (tempstate >> 6) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开机 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关机");
break;
}
temp_1 = (tempstate >> 4) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"制冷 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"制热 ");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"送风 ");
break;
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"自动 ");
break;
}
temp_1 = (tempstate >> 2) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"低速 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"中速 ");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"高速 ");
break;
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"自动 ");
break;
}
temp_1 = (tempstate >> 0) & 0x03;
switch(temp_1)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"低速 ");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"中速 ");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"高速 ");
break;
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"自动 ");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"设置温度:%d\r\n",temp_active.content);
}
break;
case Dev_RCU_NET:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"RCU设备网络没有控制内容\r\n");
break;
case DEV_RS485_CURTAIN:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"窗帘没有控制内容\r\n");
break;
case DEV_RS485_RELAY:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"继电器回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误\r\n");
break;
}
break;
case DEV_RS485_IR_SEND:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"红外发送-%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
switch(temp_active.content)
{
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"转发内容");
break;
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"静音");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"待机");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"音量加");
break;
case 0x04:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"音量减");
break;
case 0x05:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"频道加");
break;
case 0x06:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"频道减");
break;
case 0x07:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x08:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x09:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x0A:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x0B:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"OK");
break;
case 0x0C:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"主页");
break;
case 0x0D:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"菜单");
break;
case 0x0E:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"信源");
break;
case 0x0F:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"回看");
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"参数错误");
break;
}
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
switch(temp_active.content)
{
case 0x00:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"转发内容");
break;
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"静音");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"待机");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"音量加");
break;
case 0x04:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"音量减");
break;
case 0x05:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"频道加");
break;
case 0x06:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"频道减");
break;
case 0x07:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x08:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x09:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x0A:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"");
break;
case 0x0B:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"OK");
break;
case 0x0C:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"主页");
break;
case 0x0D:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"菜单");
break;
case 0x0E:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"信源");
break;
case 0x0F:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"回看");
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"内容不对");
break;
}
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"匹配 ");
switch(temp_active.content)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"空调");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"电视");
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"内容不对");
break;
}
break;
case 0x04:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"电视 ");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"频道:%d ",temp_active.content);
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_DIMMING:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"直流调光回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 亮度:%d",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 亮度:%d",temp_active.content);
break;
case 0x07:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向上循环");
break;
case 0x08:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向下循环");
break;
case 0x09:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"停止调光");
break;
case 0x0A:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向上调光 亮度:%d",temp_active.content);
break;
case 0x0B:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向下调光 亮度:%d",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"执行方式与内容不对");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_TRAIC:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"可控硅调光回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 亮度:%d",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 亮度:%d",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"执行方式与内容不对");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_STRIP:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"灯带调光回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 亮度:%d",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 亮度:%d",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"执行方式与内容不对");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_CoreCtrl:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"中控没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_WxLock:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"微信锁没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_MUSIC:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"背景音乐:%d ",temp_active.loop);
{
uint8_t function = temp_active.execute & 0x0F;
uint8_t function_para = (temp_active.execute >> 4) & 0x0F;
switch(function)
{
case 0x00:
switch(function_para)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开始播放");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"停止播放");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"上一曲");
break;
case 0x04:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"下一曲");
break;
case 0x05:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"音量加");
break;
case 0x06:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"音量减");
break;
case 0x07:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"设置音乐音量:%d",temp_active.content);
break;
case 0x08:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"设置提示音音量:%d",temp_active.content);
break;
case 0x09:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"设置门铃音量:%d",temp_active.content);
break;
}
break;
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开机");
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关机");
break;
case 0x03:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"场景开时播放 %s-%d",Logic_Data_Music_folder_To_String(function_para),temp_active.content);
break;
case 0x04:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"场景关时播放 %s-%d",Logic_Data_Music_folder_To_String(function_para),temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"执行方式与内容不对");
break;
}
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_NET_ROOMSTATE:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"房态下发没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case Dev_Host_PWMLight:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"主机本地调光回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 亮度:%d",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 亮度:%d",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"执行方式与内容不对");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_PWM:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"485PWM调光回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 亮度:%d",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 亮度:%d",temp_active.content);
break;
case 0x07:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向上循环");
break;
case 0x08:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向下调光");
break;
case 0x09:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"停止调光");
break;
case 0x0A:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向上调光 亮度:%d",temp_active.content);
break;
case 0x0B:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"向下调光 亮度:%d",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"执行方式与内容不对");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_PB_LED:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"PB总线调光回路:%d ",temp_active.loop);
switch(temp_active.execute)
{
case 0x01:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"开 亮度:%d",temp_active.content);
break;
case 0x02:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"关 亮度:%d",temp_active.content);
break;
default:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"执行方式与内容不对");
break;
}
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RCU_POWER:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"RCU电源没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_A9_IO_SWT:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"A9IO开关没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_A9_IO_EXP:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"A9IO扩展没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_A9_IO_POWER:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"A9IO电源没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_RFGatewayCycle:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"无线网关轮询没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_RFGatewayHost:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"无线网关主动没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_RFGatewayDoor:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"无线门磁没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_AirReveal:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"空气参数没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case DEV_RS485_RFGatewayRelayPir:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"无线继电器红外没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case Dev_Host_TimeCtrl:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"时间同步没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case Dev_Rs458_MonitorCtrl:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"监控控制没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case Dev_Rs458_RotaryCtrl:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"旋钮开关控制没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
case Dev_BUS_C5IO:
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"BLV_CSIO没有控制内容");
Dbg_NoTick_Print(DBG_BIT_LOGIC_STATUS_bit,"\r\n");
break;
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"执行延时时间:%d%s",temp_active.delay_time,Logic_Device_DelayUnit_To_String(temp_active.delay_unit));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"****************************");
#endif
}
/*******************************************************************************
* Function Name : Logic_FrameType_DeviceAction_TempProcessing
* Description : 逻辑文件中 - 设备动作 临时处理
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_DeviceAction_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
char temp_str[38] = {0};
uint32_t temp_len = 0;
uint32_t temp_data = 0;
uint8_t temp_num = 0;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
Lfile_info->active_num += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备类型:%d - %s",temp_data,Logic_Info_DeviceType_To_String(temp_data));
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备地址:%d",temp_data);
temp_len += 1;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"事件编号:%d",temp_data);
temp_len += 2;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入回路:%d",temp_data);
temp_len += 2;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输入事件:0x%04x",temp_data);
temp_len += 2;
temp_data = data[temp_len];
Logic_Info_DeviceAction_Condition_To_String(&data[temp_len]); //动作条件解析
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件1:%02X",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件2:%02X",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件3:%02X",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件4:%02X",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件5:%02X",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件6:%02X",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件7:%02X",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行条件8:%02X",temp_data);
temp_len += 1;
temp_len += 32; //2022-05-29 增加条件保留32Byte
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作执行方式:%02X",temp_data);
temp_len += 1;
strncpy(temp_str,(const char *)&data[temp_len],32);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"动作别名:%s",temp_str);
Dbg_Print_Buff(DBG_BIT_LOGIC_STATUS_bit,"动作别名数据" ,&data[temp_len],32);
temp_len += 32;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"场景编号:%d",temp_data);
temp_len += 2; //场景编号
temp_len += 32; //2022-05-29 保留
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输出动作数:%02X",temp_data);
temp_len += 1;
if((temp_len + temp_data*8) > len)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"输出动作数长度不对:%d - %d",temp_len + temp_data*8,len);
return ;
}
temp_num = temp_data;
//解析动作
for(uint16_t i=0;i<temp_num;i++)
{
Logic_Device_Action_Data_Analysis(&data[temp_len]);
temp_len+=8;
}
#if LOGIC_FILE_EN
Logic_DevAction_Add(data, len);
#endif
}
/*******************************************************************************
* Function Name : Logic_FrameType_VoiceMap_TempProcessing
* Description : 逻辑文件中 - 语音映射表 临时处理
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_VoiceMap_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
uint32_t temp_len = 0;
uint32_t temp_data = 0;
Lfile_info->voicemap_num += 1;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
// temp_data = data[temp_len];
// Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"词条总数:%d ",temp_data);
// temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"词条输入类型:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"词条输入地址:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制类型:%d - %s",temp_data,Logic_Info_DeviceType_To_String(temp_data));
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制地址:%d",temp_data);
temp_len += 1;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"控制回路:%d",temp_data);
temp_len += 2;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前词条下标:%d",Lfile_info->voicemap_num);
Dbg_Print_Buff(DBG_BIT_LOGIC_STATUS_bit, "当前词条对应关系:", data, 6);
if(Dev_Host_Invalid != data[0]) //不是场景
{
if( (0x00 != data[4]) && (data[2]!=Dev_Host_Invalid) )
{
data[4]--;
}
}
//Voice_Map_Dev_Add(&data[0]);
}
#if RS485_PB20Fun_Flag
/*******************************************************************************
* Function Name : Logic_FrameType_DevCheckMap_TempProcessing
* Description : 逻辑文件中 - 巡检设备回路添加
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_DevCheckMap_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
uint32_t temp_len = 0;
uint32_t temp_data = 0;
Lfile_info->devcheckmap_num += 1;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"巡检设备类型:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"巡检设备地址:%d",temp_data);
temp_len += 1;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"巡检设备回路:%d",temp_data);
temp_len += 2;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备功率下限:%d W",temp_data);
temp_len += 2;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备功率上限:%d W",temp_data);
temp_len += 2;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前巡检下标:%d",Lfile_info->devcheckmap_num);
Dbg_Print_Buff(DBG_BIT_LOGIC_STATUS_bit, "当前巡检设备详情:", data, 8);
Dev_Check_Map_Add(&data[0]);
}
#endif
/*******************************************************************************
* Function Name : Logic_FrameType_VCCondition_TempProcessing
* Description : 逻辑文件中 - 无卡取电条件信息添加
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_VCCondition_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
uint32_t temp_len = 0;
uint32_t temp_data = 0;
uint32_t list_addr = 0;
uint8_t condata[len + 4]; //条件信息 + 4个字节时间戳
memset(condata, 0 , sizeof(condata));
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 有人无人标记:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 条件组:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 条件序号:%d",temp_data);
temp_len += 1;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 延时时间:%d",temp_data);
temp_len += 2;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 延时单位:%d",temp_data);
temp_len += 1;
for(uint8_t i = 0; i < 11; i++)
{
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 端口%02d状态:%d",i,temp_data);
temp_len += 1;
}
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 超时时间:%d",temp_data);
temp_len += 2;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电条件 超时单位:%d",temp_data);
temp_len += 1;
if(data[0] == 0x01) //无人至有人逻辑标记
{
if(DevActionGlobal.VC_ConNToSSubset < (VC_CONDSUB_MAX * VC_CONDGROUP_MAX / 2))
{
list_addr = SRAM_VCard_ConNToS_Start_Addr + DevActionGlobal.VC_ConNToSSubset * sizeof(CONDITION_STRUCT); //拿到新地址
memcpy(condata,data,len);
SRAM_DMA_Write_Buff(condata, sizeof(CONDITION_STRUCT), list_addr); //接着写入数据
DevActionGlobal.VC_ConNToSSubset++;
if((data[1] > DevActionGlobal.VC_ConNToSGruop) && (data[1] <= VC_CONDGROUP_MAX))
{
DevActionGlobal.VC_ConNToSGruop = data[1];
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 无人至有人条件添加成功,当前条件地址:%08X 当前条件计数:%d ",list_addr ,DevActionGlobal.VC_ConNToSSubset);
}
else
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 无人至有人条件超过数量上限");
}
}
else if( (data[0] == 0x02) || (data[0] == 0x03) || (data[0] == 0x04) ) //有人至无人逻辑标记
{
if(DevActionGlobal.VC_ConSToNSubset < (VC_CONDSUB_MAX * VC_CONDGROUP_MAX / 2))
{
list_addr = SRAM_VCard_ConSToN_Start_Addr + DevActionGlobal.VC_ConSToNSubset * sizeof(CONDITION_STRUCT); //拿到新地址
memcpy(condata,data,len);
SRAM_DMA_Write_Buff(condata, sizeof(CONDITION_STRUCT), list_addr); //接着写入数据
DevActionGlobal.VC_ConSToNSubset++;
if((data[1] > DevActionGlobal.VC_ConSToNGruop) && (data[1] <= VC_CONDGROUP_MAX))
{
DevActionGlobal.VC_ConSToNGruop = data[1];
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 有人至无人条件添加成功,当前条件地址:%08X 当前条件计数:%d ",list_addr ,DevActionGlobal.VC_ConSToNSubset);
}
else
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 有人至无人条件超过数量上限");
}
}
}
/*******************************************************************************
* Function Name : Logic_FrameType_VCPortInfor_TempProcessing
* Description : 逻辑文件中 - 无卡取电映射端口信息添加
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_VCPortInfor_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
uint32_t temp_len = 0;
uint32_t temp_data = 0;
uint32_t list_addr = 0;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 映射端口类型:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 映射端口地址:%d",temp_data);
temp_len += 1;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 映射端口回路:%d",temp_data);
temp_len += 2;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 端口触发阈值:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 虚拟端口号:%d",temp_data);
temp_len += 1;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 启用统计标记:%d",temp_data);
temp_len += 1;
if(DevActionGlobal.VC_PortNum < VIRTUAL_PORT_MAX)
{
list_addr = SRAM_VCard_PortInf_Start_Addr + DevActionGlobal.VC_PortNum * sizeof(VPORT_INFO_STRUCT); //拿到新地址
SRAM_DMA_Write_Buff(data,sizeof(VPORT_INFO_STRUCT), list_addr); //接着写入数据
DevActionGlobal.VC_PortNum++;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 映射添加成功,当前端口地址:%08X 当前端口计数:%d ",list_addr ,DevActionGlobal.VC_PortNum); //
}
else
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电映射端口超过数量上限: %d", VIRTUAL_PORT_MAX);
}
}
/*******************************************************************************
* Function Name : Logic_FrameType_VCProperty_TempProcessing
* Description : 逻辑文件中 - 无卡取电公共属性添加
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_VCProperty_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
uint32_t temp_len = 0;
uint32_t temp_data = 0;
uint32_t list_addr = 0;
uint8_t tempflag = 0x00;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 窗口检测启用标记:%d",temp_data);
temp_len += 1;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 窗口检测时间:%d",temp_data);
temp_len += 2;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 检测时间单位:%d",temp_data);
temp_len += 1;
/*窗口检测时间 不超过10个小时*/
switch(data[3])
{
case 0x01: //秒
if(Data_Uint8_Convert_To_Uint16(&data[1]) <= (60 * 60 * 10))
{
tempflag = 0x01;
}
break;
case 0x02: //分
if(Data_Uint8_Convert_To_Uint16(&data[1]) <= (60 * 10))
{
tempflag = 0x01;
}
break;
case 0x03: //时
if(Data_Uint8_Convert_To_Uint16(&data[1]) <= 10)
{
tempflag = 0x01;
}
break;
}
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 按键触发无人至有人启用标志:%d",temp_data);
temp_len += 1;
temp_data = Data_Uint8_Convert_To_Uint16(&data[temp_len]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 最后一步超时时间:%d",temp_data);
temp_len += 2;
temp_data = data[temp_len];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电 最后一步超时时间单位:%d",temp_data);
temp_len += 1;
if(tempflag == 0x01)
{
list_addr = SRAM_VCard_Property_Start_Addr;
if(len < 1024)
{
SRAM_DMA_Write_Buff(data, len, list_addr); //接着写入数据
}
}
else
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"无卡取电检测时间超过上限");
}
}
/*******************************************************************************
* Description : 逻辑文件中 - 色温调节端口映射信息
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_FrameType_ColorTempMap_TempProcessing(
uint32_t data_addr,
LOGICFILE_Content_Of_Statistical *Lfile_info,
uint8_t *data,
uint16_t len)
{
uint32_t temp_len = 0;
uint32_t temp_data = 0;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%s",__func__);
Lfile_info->ColorTemp_Map_Addr = data_addr; //将该包数据先记录下来,等设备初始化完成后,在进行添加
temp_data = data[temp_len++];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"色温设备地址:%d",temp_data);
temp_data = data[temp_len++];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"色温回路映射数量:%d",temp_data);
}
/*******************************************************************************
* Function Name : LOGIC_FILE_Analysis
* Description : 逻辑文件读取到SRAM中
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void LOGIC_FILE_Analysis(LOGICFILE_Content_Of_Statistical *Lfile_info,uint32_t data_len)
{
uint32_t read_addr = 0;
uint8_t temp_data[4] = {0};
uint16_t temp_frame_num = 0; //逻辑总包数
uint16_t temp_frame_id = 0; //逻辑当前数
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"LOGIC_FILE_Analysis Len:%d",data_len);
read_addr = SPIFLASH_LOGIC_DataStart_ADDRESS;
for(uint32_t i=0;i<data_len;i++)
{
if((Flash_read_Byte(read_addr+Logic_D_Hear_L) == 0xCC) && (Flash_read_Byte(read_addr+Logic_D_Hear_H) == 0xC0))
{
uint16_t temp_len = 0;
Flash_Read(temp_data,4,read_addr+Logic_D_Len_L);
temp_len = temp_data[1];
temp_len <<= 8;
temp_len |= temp_data[0];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"找到文件,读取数据长度:%d",temp_len);
if(((i+temp_len) <= data_len) && (temp_len <= 1536)) //目前包长最大1024
{
uint16_t temp_crc = 0,data_crc = 0;
uint16_t data_frame = 0,data_sn = 0;
memset(Temp_Flash_Buff,0,sizeof(Temp_Flash_Buff));
Flash_Read(Temp_Flash_Buff,temp_len,read_addr);
temp_crc = NetCRC16_Data(Temp_Flash_Buff ,temp_len,Logic_D_CRC_L);
data_crc = Temp_Flash_Buff[Logic_D_CRC_H];
data_crc <<= 8;
data_crc |= Temp_Flash_Buff[Logic_D_CRC_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验:%04X %04X",data_crc,temp_crc);
if(data_crc == temp_crc)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
data_frame = Temp_Flash_Buff[Logic_D_FrameNum_H];
data_frame <<= 8;
data_frame |= Temp_Flash_Buff[Logic_D_FrameNum_L];
data_sn = Temp_Flash_Buff[Logic_D_Frame_H];
data_sn <<= 8;
data_sn |= Temp_Flash_Buff[Logic_D_Frame_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
if((temp_frame_num != 0x00) && (temp_frame_num != data_frame)) Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Frame总数不对");
if((temp_frame_id != 0x00) && ((temp_frame_id+1) != data_sn)) Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前Frame SN不对");
Dbg_Print_Buff(DBG_BIT_LOGIC_STATUS_bit,"逻辑帧数据" ,Temp_Flash_Buff,temp_len);
temp_frame_id = data_sn;
temp_frame_num = data_frame;
switch(Temp_Flash_Buff[Logic_D_FrameType])
{
case Logic_FrameType_LogicInfo:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_LogicInfo - 逻辑信息");
Logic_FrameType_LogicInfo_TempProcessing(&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_Global:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_Global - 全局信息");
Logic_FrameType_Global_TempProcessing(&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_DeviceExist:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_DeviceExist - 设备存在");
Logic_FrameType_DeviceExist_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_DeviceAction:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_DeviceAction - 设备动作");
Logic_FrameType_DeviceAction_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
#if RS485_MUSIC_BLW_Flag
case Logic_FrameType_VoiceMap:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic_FrameType_VoiceMap - 小宝语音映射");
Logic_FrameType_VoiceMap_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
#endif
#if RS485_PB20Fun_Flag
case Logic_FrameType_DevCheckMap:
Logic_FrameType_DevCheckMap_TempProcessing(read_addr,Lfile_info,&temp_buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
#endif
#if Dev_Nor_VirtualCard_Flag
case Logic_FrameType_VCCondition:
Logic_FrameType_VCCondition_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_VCPortInfor:
Logic_FrameType_VCPortInfor_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
case Logic_FrameType_VCProperty:
Logic_FrameType_VCProperty_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
#endif
case Logic_FrameType_ColorTempMap:
Logic_FrameType_ColorTempMap_TempProcessing(read_addr,Lfile_info,&Temp_Flash_Buff[Logic_D_Para],temp_len - Logic_D_Para);
break;
default:
break;
}
read_addr+=temp_len-1;
i+=temp_len - 1;
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验失败!%04X %04X",data_crc,temp_crc);
}
}else{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"读取数据长度不在范围内:%08X - %d",read_addr,temp_len);
}
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"不是逻辑文件数据包头! %d - %08x",i,read_addr);
}
read_addr++;
}
}
__attribute__((section(".non_0_wait"))) void Logic_Device_Add_To_List(uint8_t type,uint8_t *data,uint16_t len)
{
LOGICFILE_DEVICE_INFO temp_dev_info;
memcpy(&temp_dev_info,data,sizeof(LOGICFILE_DEVICE_INFO));
if(temp_dev_info.port != type)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"端口类型与数据端口类型不符!");
return;
}
switch(temp_dev_info.port)
{
case Bus_port:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"-------Bus总线-------");
switch(temp_dev_info.type)
{
case Dev_Host_HVout:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Bus总线增加强电继电器设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_HVout_For_Logic_Init(&temp_dev_info,data,len);
break;
case Dev_BUS_C5IO:
BLV_BUS_CSIO_For_Logic_Init(&temp_dev_info,data,len);
break;
case DEV_C5MUSIC_Type:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加背景音乐设备 地址: %d",temp_dev_info.addr);
//BLV_BUS_C5MUSIC_For_Logic_Init(&temp_dev_info,data,len);
break;
#if RS485_LED_Flag
case DEV_RS485_PWM:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加C12调光设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_LED_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if RS485_LCD_1602_Flag
case DEV_RS485_LCD:
BLW_RS485_LCD_For_Logic_Init(&temp_dev_info,data,len);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加LCD1602设备 地址: %d",temp_dev_info.addr);
break;
#endif
#if RS485_PB20Fun_Flag
case Dev_Rs485_PB20:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加PB20总线设备 地址: %d",temp_dev_info.addr);
BLV_RS485_PB20_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
}
break;
case Polling_Port:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"-------轮询总线---------");
switch(temp_dev_info.type)
{
case Dev_Host_HVout:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加485轮询继电器设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_HVout_For_Logic_Init(&temp_dev_info,data,len);
break;
case DEV_RS485_SWT: //开关
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加485轮询开关设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_Switch_For_Logic_Init(&temp_dev_info,data,len);
break;
case DEV_RS485_TEMP:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加轮询温控器设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_TempFun_For_Logic_Init(&temp_dev_info,data,len);
break;
#if Dev_485_Card_Polling_Flag
case DEV_RS485_CARD:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加插卡取电设备 地址: %d",temp_dev_info.addr);
//BLV_RS485_Card_Data_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if Dev_485_IrSend_Polling_Flag
// case DEV_IRTYPE:
// //Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加红外转发设备 地址: %d",temp_dev_info.addr);
// RS485_IrSend_Data_For_Logic_Init(&temp_dev_info,data,len);
// break;
#endif
#if RS485_LED_Flag
case DEV_RS485_PWM:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加轮询PWM调光设备 地址: %d, 调光协议:%d",temp_dev_info.addr,temp_dev_info.version);
//BLW_RS485_LED_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
case DEV_RS485_STRIP:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加RGB调光设备 地址: %d",temp_dev_info.addr);
// BLV_485_Dev_RGB_Light_Belt_Logic_Init(&temp_dev_info,data,len);
// BLV_485_Dev_RGB_Light_Belt_Init(DevBuf[DEVDATALEN*i + 1]);
// Poll485_Info.device_num += 1;
break;
#if Dev_485_Pir_Flag
case Dev_Host_LVinput:
switch(temp_dev_info.version)
{
case 0x02: //485红外感应
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加485红外感应设备 地址: %d",temp_dev_info.addr);
BLV_485_Dev_Pir_Data_Logic_Init(&temp_dev_info,data,len);
Poll485_Info.device_num += 1;
break;
}
break;
#endif
#if RS485_WxLock_Flag
case DEV_RS485_WxLock:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加微信锁设备 地址: %d",temp_dev_info.addr);
BLW_RS485_WeixinLockFun_Logic_Init(&temp_dev_info,data,len);
break;
#endif
case DEV_RS485_AirDetect:
#if RS485_AirDetect_Flag
// Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加空气质量检测设备 地址: %d",temp_dev_info.addr);
BLW_RS485_AirDetect_For_Logic_Init(&temp_dev_info,data,len);
#endif
break;
case DEV_RS485_MUSIC: //背景音乐
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"轮询端口增加485背景音乐设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_Music_Data_Logic_Init(&temp_dev_info,data,len);
break;
// case Dev_RS485_CardState:
// BLW_RS485_CardState_For_Logic_Init(&temp_dev_info,data,len);
// break;
#if RS485_FreshAir_Flag
case DEV_RS485_FreshAir:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"轮询端口增加485新风设备 地址: %d",temp_dev_info.addr);
BLW_RS485_FreshAirFun_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if RS485_FloorHeat_Flag
case DEV_RS485_HEATER:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"轮询端口增加485新风设备 地址: %d",temp_dev_info.addr);
BLW_RS485_FloorHeatFun_Logic_Init(&temp_dev_info,data,len);
break;
#endif
case Dev_Energy_Monitor:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"轮询端口增加485能耗监测设备 地址: %d",temp_dev_info.addr);
//BLV_RS485_EnrgyMonitor_Data_For_Logic_Init(&temp_dev_info,data,len);
break;
}
break;
case Active_Port:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"-------主动总线---------");
switch(temp_dev_info.type)
{
case Dev_Host_HVout:
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加485主动继电器设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_HVout_For_Logic_Init(&temp_dev_info,data,len);
break;
#if RS485_Dev_IN_CH6
case Dev_Host_LVinput:
switch(temp_dev_info.version) //协议
{
case 0x03: //4`185 6路输入
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加485 6路输入设备 地址: %d",temp_dev_info.addr);
BLV_485_DEV_IN_CH6_Data_Logic_Init(&temp_dev_info,data,len);
Act485_Info.device_num += 1;
break;
}
break;
#endif
case DEV_RS485_SWT:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加485主动开关设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_Switch_Init(DEVDATALEN, &DevBuf[DEVDATALEN*i]);//轮询主动端口计数在函数里面
//BLW_RS485_Switch_For_Logic_Init(&temp_dev_info,data,len);
break;
case DEV_RS485_TEMP:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加主动温控器设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_TempFun_For_Logic_Init(&temp_dev_info,data,len);
break;
#if RS485_LED_Flag
case DEV_RS485_PWM:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加主动PWM调光设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_LED_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if RS485_RFGatewayHost_Flag
case DEV_RS485_RFGatewayHost: //主网关
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加主网关设备 地址: %d",temp_dev_info.addr);
BLW_RS485_RF_GatewayHost_Logic_Init(&temp_dev_info,data,len);
Act485_Info.device_num += 1;
break;
#endif
#if RS485_WxLock_Flag
case DEV_RS485_WxLock:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加微信锁设备 地址: %d",temp_dev_info.addr);
BLW_RS485_WeixinLockFun_Logic_Init(&temp_dev_info,data,len); //轮询主动端口计数在函数里面
break;
#endif
#if RS485_MUSIC_BLW_Flag
case DEV_XiaoBao_Type:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加小宝设备 地址: %d",temp_dev_info.addr);
BLV_485_Dev_XiaoBao_Logic_Init(&temp_dev_info,data,len);
//BLV_485_Dev_XiaoBao_Init(DevBuf[DEVDATALEN*i + 1]);
Act485_Info.device_num += 1;
break;
#endif
case DEV_RS485_MUSIC: //背景音乐
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"主动端口增加背景音乐设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_Music_Data_Logic_Init(&temp_dev_info,data,len);
break;
#if RS485_AirReveal_Flag
case DEV_RS485_AirReveal: //空气质量显示
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加空气质量显示设备 地址: %d",temp_dev_info.addr);
BLW_RS485_AirReveal_For_Logic_Init(&temp_dev_info,data,len);
Act485_Info.device_num += 1;
break;
#endif
case DEV_PCTEST_TYPE:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加PC调试设备 地址: %d",temp_dev_info.addr);
break;
case Dev_Host_TimeCtrl: //时间设备
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加时间设备 地址: %d",temp_dev_info.addr);
//BLV_485_Dev_Time_Logic_Init(&temp_dev_info,data,len);
Act485_Info.device_num += 1;
break;
#if RS485_Curtain_Flag
case DEV_RS485_CURTAIN:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加485窗帘设备 地址: %d",temp_dev_info.addr);
//BLW_RS485_Curtain_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
// case Dev_RS485_CardState:
// BLW_RS485_CardState_For_Logic_Init(&temp_dev_info,data,len);
// break;
#if RS485_FreshAir_Flag
case DEV_RS485_FreshAir:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"主动端口增加485新风设备 地址: %d",temp_dev_info.addr);
BLW_RS485_FreshAirFun_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if RS485_FloorHeat_Flag
case DEV_RS485_HEATER:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"主动端口增加485地暖设备 地址: %d",temp_dev_info.addr);
BLW_RS485_FloorHeatFun_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if RS485_Switch_Rotary_Flag
case Dev_Rs458_RotaryCtrl:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加旋钮 设备地址: %d",temp_dev_info.addr);
//BLW_RS485_Rotary_Switch_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if Dev_485_Card_Active_Flag
case DEV_RS485_CARD:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加主动插卡取电 设备地址: %d",temp_dev_info.addr);
//BLV_RS485_Card_Data_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
#if Dev_485_IrSend_Active_Flag
// case DEV_IRTYPE:
// Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加主动红外转发设备 地址: %d",temp_dev_info.addr);
// RS485_IrSend_Data_For_Logic_Init(&temp_dev_info,data,len);
// break;
#endif
#if Dev_485_BLE_Music_Flag
case Dev_485_BLE_Music:
BLV_RS485_BLE_Music_For_Logic_Init(&temp_dev_info,data,len);
break;
#endif
case Dev_Energy_Monitor:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加主动 485能耗监测设备 地址: %d",temp_dev_info.addr);
//BLV_RS485_EnrgyMonitor_Data_For_Logic_Init(&temp_dev_info,data,len);
break;
}
break;
case 0x00:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"-------普通设备总线---------");
switch(temp_dev_info.type)
{
case Dev_Host_Service:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加服务信息设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_Service_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
case Dev_Host_LVinput:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加弱电输入设备 地址: %d",temp_dev_info.addr);
BLV_BUS_CSIO_DI_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
case Dev_Host_HVout:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加强电继电器设备 地址: %d",temp_dev_info.addr);
break;
case Dev_Host_LVoutput:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加弱电输出设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_LVoutput_Init(temp_dev_info.addr);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
case Dev_NodeCurtain:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加干接点窗帘设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_Curtain_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#if RS485_PB20_LD_Flag
case Dev_Rs485_PB20_LD:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加PB20_LED设备 地址: %d",temp_dev_info.addr);
BLV_RS485_PB20_LED_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
#if RS485_PB20_LS_Flag
case Dev_Rs485_PB20_LS:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加PB20_LS设备 地址: %d",temp_dev_info.addr);
BLV_RS485_PB20_Strip_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
#if RS485_PB20_Relay_Flag
case Dev_Rs485_PB20_Relay:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加PB20_Relay设备 地址: %d",temp_dev_info.addr);
BLV_RS485_PB20_Relay_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
#if Dev_Nor_NoCard_Flag
case DEV_Virtual_NoCard:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加虚拟无卡断电设备 地址: %d",temp_dev_info.addr);
BLV_Nor_Dev_NoCard_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
#if Dev_Nor_VirtualCard_Flag
case DEV_Virtual_Card:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加虚拟无卡取电设备 地址: %d",temp_dev_info.addr);
BLV_Nor_Dev_VirtualCard_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
#if Dev_Nor_ColorTemp
case DEV_Virtual_ColorTemp:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加色温调节设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_ColorTemp_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
#if Dev_Nor_Carbon_Flag
case DEV_Carbon_Saved:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加碳达人设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_Carbon_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
#if Dev_Nor_Scene_Restore_Flag
case Dev_Scene_Restore:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加场景还原设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_SceneRestore_For_Logic_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
//2025-07-14,YYW,全局设置 - 初始化
#if Dev_Nor_GlobalSet_Flag
case Dev_Virtual_GlobalSet:
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"增加全局设置设备 地址: %d",temp_dev_info.addr);
//BLV_Nor_Dev_GlobalSet_Init(&temp_dev_info,data,len);
NorDevInfoGlobal.NorDeviceNum += 1;
break;
#endif
}
break;
}
}
/*******************************************************************************
* Function Name : Logic_File_To_Device_Init
* Description : 逻辑文件中 - 设备存在 - 初始化函数
* Input :
dev_info :设备结构体
data :输入设置数组
len :输入设置数组长度
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void Logic_File_Device_Init(LOGICFILE_Content_Of_Statistical *Lfile_info,uint32_t data_len)
{
uint32_t read_addr = 0;
uint8_t temp_data[4] = {0};
uint16_t temp_frame_num = 0; //逻辑总包数
uint16_t temp_frame_id = 0; //逻辑当前数
uint16_t device_Init_num = 0;
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"LOGIC_FILE_Analysis Len:%d",data_len);
read_addr = SPIFLASH_LOGIC_DataStart_ADDRESS;
for(uint32_t i=0;i<data_len;i++)
{
if((Flash_read_Byte(read_addr+Logic_D_Hear_L) == 0xCC) && (Flash_read_Byte(read_addr+Logic_D_Hear_H) == 0xC0))
{
uint16_t temp_len = 0;
Flash_Read(temp_data,4,read_addr+Logic_D_Len_L);
temp_len = temp_data[1];
temp_len <<= 8;
temp_len |= temp_data[0];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"%d 找到文件,读取数据长度:%d",i,temp_len);
if(((i+temp_len) < data_len) && (temp_len <= 1024)) //目前包长最大1024
{
uint16_t temp_crc = 0,data_crc = 0;
uint16_t data_frame = 0,data_sn = 0;
uint8_t temp_buff[temp_len];
memset(temp_buff,0,sizeof(temp_buff));
Flash_Read(temp_buff,temp_len,read_addr);
temp_crc = NetCRC16_Data(temp_buff ,temp_len,Logic_D_CRC_L);
data_crc = temp_buff[Logic_D_CRC_H];
data_crc <<= 8;
data_crc |= temp_buff[Logic_D_CRC_L];
if(data_crc == temp_crc)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
data_frame = temp_buff[Logic_D_FrameNum_H];
data_frame <<= 8;
data_frame |= temp_buff[Logic_D_FrameNum_L];
data_sn = temp_buff[Logic_D_Frame_H];
data_sn <<= 8;
data_sn |= temp_buff[Logic_D_Frame_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
if((temp_frame_num != 0x00) && (temp_frame_num != data_frame)) Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Frame总数不对");
if((temp_frame_id != 0x00) && ((temp_frame_id+1) != data_sn)) Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前Frame SN不对");
temp_frame_id = data_sn;
temp_frame_num = data_frame;
if(temp_buff[Logic_D_FrameType] == Logic_FrameType_DeviceExist)
{
//Logic_Device_Add_To_List(&temp_buff[Logic_D_Para],temp_len - Logic_D_Para);
device_Init_num++;
if(Lfile_info->device_num <= device_Init_num) {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic File 设备初始化完毕");
break;
}
}
read_addr+=temp_len-1;
i+=temp_len - 1;
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验失败!");
}
}else{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"读取数据长度不在范围内:%08X - %d",read_addr,temp_len);
}
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"不是逻辑文件数据包头! %d - %08x",i,read_addr);
}
read_addr++;
}
}
/*******************************************************************************
* Function Name : SRAM_Dev_Data_Check
* Description : SRAM 设备数据校验
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) void SRAM_Dev_Data_Check(void)
{
uint16_t i; //遍历设备
uint32_t Dev_processing_addr;
Device_Public_Information_G BUS_Public; //公有全局数据
for(i = 0; i < DevActionGlobal.DevNum; i++)
{
Dev_processing_addr = SRAM_Device_List_Start_Addr + i*SRAM_Device_List_Size;
SRAM_DMA_Read_Buff((uint8_t *)&BUS_Public, sizeof(Device_Public_Information_G), Dev_processing_addr); //拷贝所有公有数据
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"当前设备下标:%d,地址:%08X设备类型:%d设备地址:%d", i, Dev_processing_addr, BUS_Public.type, BUS_Public.addr);
Dbg_Print_Buff(DBG_BIT_NET_STATUS_bit,"BUS_Public Data:",(uint8_t *)&BUS_Public, sizeof(BUS_Public));
}
}
/*******************************************************************************
* Function Name : LOGIC_FILE_Check
* Description : 逻辑文件读取到SRAM中
* Input :
* Return :
*******************************************************************************/
__attribute__((section(".non_0_wait"))) uint8_t LOGIC_FILE_Check(void)
{
uint32_t temp = 0;
uint32_t file_len = 0;
uint8_t file_info[24];
uint8_t md5[16];
LOGICFILE_Content_Of_Statistical Lfile_stat;
memset(md5,0,sizeof(md5));
memset(file_info,0,sizeof(file_info));
memset(&Lfile_stat,0,sizeof(LOGICFILE_Content_Of_Statistical)); //文件统计
//读取MD5值并校验
Flash_Read(file_info,24,SPIFLASH_LOGIC_DataFlag_ADDRESS);
temp = file_info[3];
temp <<= 8;
temp |= file_info[2];
temp <<= 8;
temp |= file_info[1];
temp <<= 8;
temp |= file_info[0];
if(temp == LOGIC_DataFlag)
{
file_len = file_info[7];
file_len <<= 8;
file_len |= file_info[6];
file_len <<= 8;
file_len |= file_info[5];
file_len <<= 8;
file_len |= file_info[4];
if((file_len != 0x00) &&(file_len >= 0x70000))
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件长度不对:%08X",file_len);
return 0x01;
}
MD5Digest_FLASH(SPIFLASH_LOGIC_DataStart_ADDRESS, file_len,(char *)&md5[0]);
if(0==strncmp((const char *)md5,(const char *)&file_info[8],16))
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验成功!");
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"MD5校验错误不作处理 Len:%08X",file_len);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"升级配置失败Md5错误:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X%02X,%02X,%02X,%02X,%02X,%02X",md5[0],md5[1],md5[2],md5[3],md5[4],md5[5],md5[6],md5[7],md5[8],md5[9],md5[10],md5[11],md5[12],md5[13],md5[14],md5[15]);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"UDP Md5:%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X,%02X",\
file_info[8],file_info[9],\
file_info[10],file_info[11],\
file_info[12],file_info[13],\
file_info[14],file_info[15],\
file_info[16],file_info[17],\
file_info[18],file_info[19],\
file_info[21],file_info[21],\
file_info[22],file_info[23]);
return 0x01;
}
/*文件解析 - 先全部遍历一遍,找到所以的数据类型*/
LOGIC_FILE_Analysis(&Lfile_stat,file_len);
}else {
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"逻辑文件标志位不符,不作处理:%08X",temp);
}
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--------------------");
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备存在总数:%d",Lfile_stat.device_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--BUS设备存在%d",Lfile_stat.Bus_device_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--Polling设备存在%d",Lfile_stat.Polling_device_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--Active设备存在%d",Lfile_stat.Active_device_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--普通设备存在:%d",Lfile_stat.Nor_device_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--------------------");
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"设备动作总数:%d",Lfile_stat.active_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--------------------");
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"映射表总数:%d",Lfile_stat.voicemap_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"巡检表总数:%d",Lfile_stat.devcheckmap_num);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"--------------------");
/*将逻辑表中的设备进行初始化*/
memset((void *)&BUS485_Info,0,sizeof(BLV_BUS_Manage_G));
memset((void *)&Poll485_Info,0,sizeof(BLV_POLL_Manage_G));
memset((void *)&Act485_Info,0,sizeof(BLV_ACTIVE_Manage_G));
SRAM_Write_DW(SRAM_Device_List_Start_Addr,SRAM_BUS_Device_List_Addr);
//添加BUS设备
for(uint8_t i=0;i<Lfile_stat.Bus_device_num;i++)
{
uint32_t data_addr = Lfile_stat.Bus_device_addr[i];
uint16_t temp_crc = 0,data_crc = 0;
uint16_t data_frame = 0,data_sn = 0;
uint16_t data_len = 0;
Flash_Read(file_info,4,data_addr+Logic_D_Len_L);
data_len = file_info[1];
data_len <<= 8;
data_len |= file_info[0];
uint8_t dev_buff[data_len];
memset(dev_buff,0,sizeof(dev_buff));
Flash_Read(dev_buff,data_len,data_addr);
temp_crc = NetCRC16_Data(dev_buff ,data_len,Logic_D_CRC_L);
data_crc = dev_buff[Logic_D_CRC_H];
data_crc <<= 8;
data_crc |= dev_buff[Logic_D_CRC_L];
if(data_crc == temp_crc)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
data_frame = dev_buff[Logic_D_FrameNum_H];
data_frame <<= 8;
data_frame |= dev_buff[Logic_D_FrameNum_L];
data_sn = dev_buff[Logic_D_Frame_H];
data_sn <<= 8;
data_sn |= dev_buff[Logic_D_Frame_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
if(dev_buff[Logic_D_FrameType] == Logic_FrameType_DeviceExist)
{
Logic_Device_Add_To_List(Bus_port,&dev_buff[Logic_D_Para],data_len - Logic_D_Para);
}
}
}
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS总线设备个数:%d", BUS485_Info.device_num);
BUS485_Info.Last_list_addr = SRAM_Device_List_Start_Addr;
BUS485_Info.port_mode = Port_Normal_Mode;
BUS485_Info.baud = 115200;
BUS485_Info.BaudRateCfg = &UART3_ChangeBaud;
BUS485_Info.BUS_Start = B_IDLE;
/*BLV_BUS端口初始化*/
UARTx_Init(UART_3,BUS485_Info.baud);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS485 Device Info Endaddr:%08X ---",SRAM_Read_DW(SRAM_BUS_Device_List_Addr));
Poll485_Info.Last_list_addr = SRAM_Read_DW(SRAM_BUS_Device_List_Addr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Poll485_Info addr:%08X ----",Poll485_Info.Last_list_addr);
SRAM_Write_DW(Poll485_Info.Last_list_addr,SRAM_POLL_Device_List_Addr); //初始化Polling起始地址
//添加轮询设备
for(uint8_t i=0;i<Lfile_stat.Polling_device_num;i++)
{
uint32_t data_addr = Lfile_stat.Polling_device_addr[i];
uint16_t temp_crc = 0,data_crc = 0;
uint16_t data_frame = 0,data_sn = 0;
uint16_t data_len = 0;
Flash_Read(file_info,4,data_addr+Logic_D_Len_L);
data_len = file_info[1];
data_len <<= 8;
data_len |= file_info[0];
uint8_t dev_buff[2048];
memset(dev_buff,0,sizeof(dev_buff));
Flash_Read(dev_buff,data_len,data_addr);
temp_crc = NetCRC16_Data(dev_buff ,data_len,Logic_D_CRC_L);
data_crc = dev_buff[Logic_D_CRC_H];
data_crc <<= 8;
data_crc |= dev_buff[Logic_D_CRC_L];
if(data_crc == temp_crc)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
data_frame = dev_buff[Logic_D_FrameNum_H];
data_frame <<= 8;
data_frame |= dev_buff[Logic_D_FrameNum_L];
data_sn = dev_buff[Logic_D_Frame_H];
data_sn <<= 8;
data_sn |= dev_buff[Logic_D_Frame_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
if(dev_buff[Logic_D_FrameType] == Logic_FrameType_DeviceExist)
{
Logic_Device_Add_To_List(Polling_Port,&dev_buff[Logic_D_Para],data_len - Logic_D_Para);
}
}
}
// Dbg_Println(DBG_BIT_SYS_STATUS_bit,"默认添加轮询插卡状态同步设备");
// BLW_RS485_CardState_AddTo_PollingPort(); //2023-10-31
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"轮询总线设备个数:%d", Poll485_Info.device_num);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BLV_POLL_dev END:%08X",SRAM_Read_DW(SRAM_POLL_Device_List_Addr));
/*端口初始化*/
Poll485_Info.port_mode = Port_Normal_Mode;
Poll485_Info.baud = 9600;
#if (USE_CORE_TYPE == 1) //使用C1F核心板
Poll485_Info.BaudRateCfg = &UART0_ChangeBaud;
USART_INIT(USART_0,Poll485_Info.baud); //C1F的轮询口是串口0
#elif (USE_CORE_TYPE == 2) //使用C1核心板
Poll485_Info.BaudRateCfg = &UART1_ChangeBaud;
USART_INIT(USART_1,Poll485_Info.baud); //C1的轮询口是串口1
#endif //USE_CORE_TYPE == CORE_TYPE_C1F
Act485_Info.Last_list_addr = SRAM_Read_DW(SRAM_POLL_Device_List_Addr); //主动设备起始地址
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Act485_Info addr:%08X ----",Act485_Info.Last_list_addr);
SRAM_Write_DW(Act485_Info.Last_list_addr,SRAM_ACTIVE_Device_List_Addr); //初始化主动设备信息起始地址
Act485_Info.device_num = 0;
//添加主动设备
for(uint8_t i=0;i<Lfile_stat.Active_device_num;i++)
{
uint32_t data_addr = Lfile_stat.Active_device_addr[i];
uint16_t temp_crc = 0,data_crc = 0;
uint16_t data_frame = 0,data_sn = 0;
uint16_t data_len = 0;
Flash_Read(file_info,4,data_addr+Logic_D_Len_L);
data_len = file_info[1];
data_len <<= 8;
data_len |= file_info[0];
uint8_t dev_buff[2048];
memset(dev_buff,0,sizeof(dev_buff));
Flash_Read(dev_buff,data_len,data_addr);
temp_crc = NetCRC16_Data(dev_buff ,data_len,Logic_D_CRC_L);
data_crc = dev_buff[Logic_D_CRC_H];
data_crc <<= 8;
data_crc |= dev_buff[Logic_D_CRC_L];
if(data_crc == temp_crc)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
data_frame = dev_buff[Logic_D_FrameNum_H];
data_frame <<= 8;
data_frame |= dev_buff[Logic_D_FrameNum_L];
data_sn = dev_buff[Logic_D_Frame_H];
data_sn <<= 8;
data_sn |= dev_buff[Logic_D_Frame_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
if(dev_buff[Logic_D_FrameType] == Logic_FrameType_DeviceExist)
{
Logic_Device_Add_To_List(Active_Port,&dev_buff[Logic_D_Para],data_len - Logic_D_Para);
}
}
}
/*增加测试接口*/
//Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"默认添加PC调试接口 ");
//BLV_PC_DEVICE_TEST_Init();
//Act485_Info.device_num += 1;
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"默认添加主动插卡状态同步设备");
//BLW_RS485_CardState_AddTo_ActivePort(); //2023-10-31
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"主动总线设备个数:%d", Act485_Info.device_num);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Active Device End List:%08X" , SRAM_Read_DW(SRAM_ACTIVE_Device_List_Addr));
Act485_Info.Act_Start = B_IDLE;
Act485_Info.baud = 9600;
Act485_Info.port_mode = Port_Normal_Mode;
Act485_Info.BaudRateCfg = &UART2_ChangeBaud;
/*初始化主动端口*/
UARTx_Init(UART_2,Act485_Info.baud);
temp = SRAM_Read_DW(SRAM_ACTIVE_Device_List_Addr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Act485 Device Info Endaddr:%08X ----",temp);
SRAM_Write_DW(temp,SRAM_NORMAL_Device_List_Addr);
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"普通设备存在:%08X",temp);
//添加普通设备
for(uint8_t i=0;i<Lfile_stat.Nor_device_num;i++)
{
uint32_t data_addr = Lfile_stat.Nor_device_addr[i];
uint16_t temp_crc = 0,data_crc = 0;
uint16_t data_frame = 0,data_sn = 0;
uint16_t data_len = 0;
Flash_Read(file_info,4,data_addr+Logic_D_Len_L);
data_len = file_info[1];
data_len <<= 8;
data_len |= file_info[0];
uint8_t dev_buff[2048];
memset(dev_buff,0,sizeof(dev_buff));
Flash_Read(dev_buff,data_len,data_addr);
temp_crc = NetCRC16_Data(dev_buff ,data_len,Logic_D_CRC_L);
data_crc = dev_buff[Logic_D_CRC_H];
data_crc <<= 8;
data_crc |= dev_buff[Logic_D_CRC_L];
if(data_crc == temp_crc)
{
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
data_frame = dev_buff[Logic_D_FrameNum_H];
data_frame <<= 8;
data_frame |= dev_buff[Logic_D_FrameNum_L];
data_sn = dev_buff[Logic_D_Frame_H];
data_sn <<= 8;
data_sn |= dev_buff[Logic_D_Frame_L];
Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
if(dev_buff[Logic_D_FrameType] == Logic_FrameType_DeviceExist)
{
Logic_Device_Add_To_List(0x00,&dev_buff[Logic_D_Para],data_len - Logic_D_Para);
}
}
}
//Dbg_Println(DBG_BIT_SYS_STATUS_bit,"默认添加白天黑夜虚拟时间设备");
//BLV_Nor_Dev_VirtualTime_Default_Init(); //2024-08-02
//NorDevInfoGlobal.NorDeviceNum++;
temp = SRAM_Read_DW(SRAM_NORMAL_Device_List_Addr);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Nor Device Info Endaddr:%08X ----",temp);
/*处理新增协议 - 色温调节回路映射信息处理*/
// if(Lfile_stat.ColorTemp_Map_Addr != 0x00)
// {
// uint32_t data_addr = Lfile_stat.ColorTemp_Map_Addr;
// uint16_t temp_crc = 0,data_crc = 0;
// uint16_t data_frame = 0,data_sn = 0;
// uint16_t data_len = 0;
//
// Flash_Read(file_info,4,data_addr+Logic_D_Len_L);
//
// data_len = file_info[1];
// data_len <<= 8;
// data_len |= file_info[0];
//
// uint8_t dev_buff[2048];
// memset(dev_buff,0,sizeof(dev_buff));
//
// Flash_Read(dev_buff,data_len,data_addr);
// temp_crc = NetCRC16_Data(dev_buff ,data_len,Logic_D_CRC_L);
//
// data_crc = dev_buff[Logic_D_CRC_H];
// data_crc <<= 8;
// data_crc |= dev_buff[Logic_D_CRC_L];
//
// if(data_crc == temp_crc)
// {
// Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"CRC校验成功");
//
// data_frame = dev_buff[Logic_D_FrameNum_H];
// data_frame <<= 8;
// data_frame |= dev_buff[Logic_D_FrameNum_L];
//
// data_sn = dev_buff[Logic_D_Frame_H];
// data_sn <<= 8;
// data_sn |= dev_buff[Logic_D_Frame_L];
//
// Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"Logic Data SN:%d,NUM:%d",data_sn,data_frame);
//
// if(dev_buff[Logic_D_FrameType] == Logic_FrameType_ColorTempMap)
// {
// /*数据内容进行处理*/
// data_addr = Find_Device_List_Information(DEV_Virtual_ColorTemp,dev_buff[Logic_D_Para]);
// if(data_addr != 0x00){
// Dev_ColorTemp_LoopBound(data_addr,&dev_buff[Logic_D_Para],data_len - Logic_D_Para);
// }else{
// Dbg_Println(DBG_BIT_LOGIC_STATUS_bit,"没找到色温设备");
// }
// }
// }
// }
DevActionGlobal.DevNum = BUS485_Info.device_num + Poll485_Info.device_num + Act485_Info.device_num + NorDevInfoGlobal.NorDeviceNum;
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"BUS485_Info.device_num:%d", BUS485_Info.device_num);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Poll485_Info.device_num:%d", Poll485_Info.device_num);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"Act485_Info.device_num:%d", Act485_Info.device_num);
Dbg_Println(DBG_BIT_SYS_STATUS_bit,"NorDevInfoGlobal.NorDeviceNum:%d", NorDevInfoGlobal.NorDeviceNum);
SRAM_Dev_Data_Check();
return 0x00;
}