using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
using System.Threading.Tasks;
namespace Shared.Phone.UserCenter
{
///
/// 干接点的逻辑
///
public class HdlDevicePanelLogic
{
#region ■ 变量声明___________________________
///
/// 干接点的逻辑
///
private static HdlDevicePanelLogic m_Current = null;
///
/// 干接点的逻辑
///
public static HdlDevicePanelLogic Current
{
get
{
if (m_Current == null)
{
m_Current = new HdlDevicePanelLogic();
}
return m_Current;
}
}
///
/// 干接点的私有属性 keys:设备主键,value:各级别的值
///
private Dictionary dicDryContactFunction = new Dictionary();
#endregion
#region ■ 初始化_____________________________
///
/// 初始化
///
public HdlDevicePanelLogic()
{
//从本地文件还原干接点的私有属性
this.LoadDryContactFunctionFromLocaltion();
}
#endregion
#region ■ 颜色调节___________________________
///
/// 获取按键面板指定端点的【指示灯开关颜色】的信息(出错会返回null)
///
/// 按键面板的某一个回路
///
public async Task GetPanelEpointColorInfo(Panel panel)
{
Panel.KeyNum keyNum = (Panel.KeyNum)panel.DeviceEpoint;
var result = await panel.GetPanelColorInfoAsync(keyNum);
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowErrorMsg(error);
return null;
}
if (result == null || result.keyColorData == null)
{
//获取按键面板颜色调节信息失败
string msg = Language.StringByID(R.MyInternationalizationString.uGetPanelColorRegulationInfoFail);
this.ShowErrorMsg(msg);
return null;
}
return result.keyColorData;
}
///
/// 设置按键面板指定端点的【指示灯开关颜色】的信息
///
/// 按键面板的某一个回路
/// 开和关的颜色都需要一起设置
///
public async Task SetPanelEpointColorInfo(Panel panel, Panel.KeyColorData colorData)
{
var keyNum = new Panel.KeyNumStatus();
Type type = keyNum.GetType();
type.InvokeMember("Key" + panel.DeviceEpoint, System.Reflection.BindingFlags.SetField, null, keyNum, new object[] { true });
var result = await panel.SetPanelColorInfoAsync(colorData, keyNum);
if (result == null || result.responseData == null)
{
//设置按键面板指示灯颜色失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetPanelPilolightSettionFail);
this.ShowErrorMsg(msg);
return false;
}
if (result.responseData.status != 0)
{
//设置按键面板指示灯颜色失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetPanelPilolightSettionFail);
this.ShowErrorMsg(msg);
return false;
}
//备份设备
await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(panel, GatewayBackupEnum.A干接点颜色调节, colorData);
return true;
}
#endregion
#region ■ 亮度调节___________________________
///
/// 获取设备亮度配置(ui叫亮度调节,使用返回值的panelDirectionsLevel)
///
/// 设备对象
///
public async Task GetDeviceLightSettion(CommonDevice device)
{
//借用它的函数
var panel = new Panel();
panel.DeviceAddr = device.DeviceAddr;
panel.DeviceEpoint = device.DeviceEpoint;
panel.CurrentGateWayId = device.CurrentGateWayId;
var result = await panel.GetPanelSwitchLevelAsync();
panel = null;
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowErrorMsg(error);
return null;
}
if (result == null || string.IsNullOrEmpty(result.errorMessageBase) == false)
{
//获取按键面板亮度调节信息失败
string msg = Language.StringByID(R.MyInternationalizationString.uGetPanelLightRegulationInfoFail);
this.ShowErrorMsg(msg);
return null;
}
return result;
}
///
/// 设置设备亮度(ui叫亮度调节)
///
/// 设备对象
/// 0-100(这个是点击后的值)
/// 0-100(这个是点击前的值)
///
public async Task SetDeviceLightSettion(CommonDevice device, int directionsLevel, int backlightLevel)
{
//借用它的函数
var panel = new Panel();
panel.DeviceAddr = device.DeviceAddr;
panel.DeviceEpoint = device.DeviceEpoint;
panel.CurrentGateWayId = device.CurrentGateWayId;
var result = await panel.SetKeyLevelAsync(directionsLevel, backlightLevel);
panel = null;
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowTipMsg(error);
return false;
}
if (result == null || result.responseData == null)
{
//设置亮度调节失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetLightRegulationFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowTipMsg(msg);
return false;
}
if (result.responseData.status != 0)
{
//设置亮度调节失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetLightRegulationFail);
this.ShowTipMsg(msg);
return false;
}
//备份设备
var backData = new Newtonsoft.Json.Linq.JObject
{
{ "directionsLevel",directionsLevel },
{ "backlightLevel", backlightLevel }
};
//备份设备
await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(device, GatewayBackupEnum.A干接点亮度调节, backData);
return true;
}
#endregion
#region ■ 节能模式___________________________
///
/// 获取设备节能模式的配置状态(ui叫节能模式)
///
/// 设备对象
///
public async Task GetDeviceEnergyConservationMode(CommonDevice device)
{
//借用它的函数
var panel = new Panel();
panel.DeviceAddr = device.DeviceAddr;
panel.DeviceEpoint = device.DeviceEpoint;
panel.CurrentGateWayId = device.CurrentGateWayId;
var result = await panel.GetPanelSaveEnergyModeAsync();
panel = null;
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowErrorMsg(error);
return null;
}
if (result == null || result.panelSaveEnergyModeInfo == null)
{
//获取按键面板节能模式信息失败
string msg = Language.StringByID(R.MyInternationalizationString.uGetPanelEnergyConservationInfoFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return null;
}
return result.panelSaveEnergyModeInfo;
}
///
/// 设置设备的节能模式(ui叫节能模式)
///
/// 设备对象
/// 节能模式是否有效
/// 无操作进入节能模式时间 0-255
/// 节能模式亮度:0-100
///
public async Task SetDeviceEnergyConservationMode(CommonDevice device, bool modeEnable, int modeTime, int level)
{
//借用它的函数
var panel = new Panel();
panel.DeviceAddr = device.DeviceAddr;
panel.DeviceEpoint = device.DeviceEpoint;
panel.CurrentGateWayId = device.CurrentGateWayId;
var result = await panel.SetKeyModeAsync(modeEnable, modeTime, level);
panel = null;
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowErrorMsg(error);
return false;
}
if (result == null || result.responseData == null)
{
//节能模式配置失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetEnergyConservationFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowTipMsg(msg);
return false;
}
if (result.responseData.status != 0)
{
//节能模式配置失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetEnergyConservationFail);
this.ShowTipMsg(msg);
return false;
}
//备份设备
var backData = new Newtonsoft.Json.Linq.JObject
{
{ "modeEnable",modeEnable },
{ "modeTime", modeTime },
{ "level", level }
};
//备份设备
await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(device, GatewayBackupEnum.A干接点节能模式, backData);
return true;
}
#endregion
#region ■ 获取干接点配置信息_________________
///
/// 获取干接点配置信息
///
/// 干接点对象
///
public async Task> GetDryContactConfigureInfo(CommonDevice device)
{
//借用它的函数
var panel = new Panel();
panel.DeviceAddr = device.DeviceAddr;
panel.DeviceEpoint = device.DeviceEpoint;
panel.CurrentGateWayId = device.CurrentGateWayId;
var result = await panel.ReadPanelConfigureInfoAsync();
panel = null;
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowErrorMsg(error);
return null;
}
if (result == null || result.deviceStatusReportData == null)
{
//获取设备配置信息失败
string msg = Language.StringByID(R.MyInternationalizationString.uGetDeviceConfigureInfoFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return null;
}
//如果不是6的话,这个数据是不对的
if (result.deviceStatusReportData.CluterID != 6)
{
return new List();
}
return result.deviceStatusReportData.AttriBute;
}
#endregion
#region ■ 获取干接点功能系___________________
///
/// 获取干接点功能系(异常时返回null,或者它没有指定功能,也会返回null)
/// 第一级别(参数全部省略时):
/// 1024:灯类|256:按键类|768:PIR类
/// 第二级别:
/// 1:特殊功能|100:Switch,开关(按键类)
/// 200:Dimmer,调光(按键类)|300:Curtain,窗帘(按键类)
/// 0:EnergySavingMode,节能模式(灯类)|1:SleepMode,睡眠模式(灯类)
/// 100:WhiteBalance,白平衡(灯类)|101:RGBColor,RGB指示灯颜色(灯类)
/// 102:RGBLevel,RGB指示灯亮度(灯类)
/// 第三级别:
/// 1:场景触发|65535:禁止发送功能
/// 100:SwitchOpen,开关开(按键类)|101:SwitchClose,开关关(按键类)
/// 102:SwitchChange,开关切换(按键类)|200:DimmerStepUp,增大调光(按键类)
/// 201:DimmerStepDown,降低调光(按键类)|202:DimmerStepChange,调光切换(按键类)
/// 300:CurtainOpen,窗帘开(按键类)|301:CurtainClose,窗帘关(按键类)
/// 302:CurtainStop,窗帘停|303:CurtainUpStop,窗帘上升停
/// 304:CurtainDownstop,窗帘下降停
///
/// 干接点对象
/// 请参照第一级别的参数,省略时返回第一级别列表,设置时返回第二级别列表
/// 请参照第二级别的参数,省略时返回第二级别列表,设置时返回第三级别列表
/// 重新获取第三级别的数据
///
public async Task> GetDryContactFunction(Panel panel, int level1 = -1, int level2 = -1, bool reLevel3 = false)
{
string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(panel);
if (dicDryContactFunction.ContainsKey(mainkeys) == false)
{
//创建对象
dicDryContactFunction[mainkeys] = new DryContactFunctionInfo();
}
var functionInfo = dicDryContactFunction[mainkeys];
//获取第一级别(属性应该不会改变)
Panel.PanelPrivateFunctionsResponseInfo result = null;
if (functionInfo.listLevel1 == null)
{
result = await this.GetDryContactFunctionInterface(panel);
if (result == null)
{
return null;
}
//保存属性
this.SetDryContactFunctionToMemory(panel, result.privateFuncTypeLevelFirstList, -1, -1);
if (level1 == -1)
{
return result.privateFuncTypeLevelFirstList;
}
}
//获取第二级别(属性应该不会改变)
if (functionInfo.dicLevel2.ContainsKey(level1) == false)
{
result = await this.GetDryContactFunctionInterface(panel, new int[] { level1 });
if (result == null)
{
return null;
}
//保存属性
this.SetDryContactFunctionToMemory(panel, result.privateFuncTypeLevelSecondList, level1, -1);
if (level2 == -1)
{
return result.privateFuncTypeLevelSecondList;
}
}
//获取第三级别(属性有可能会改变)
if (reLevel3 == true || functionInfo.dicLevel3.ContainsKey(level2) == false)
{
result = await this.GetDryContactFunctionInterface(panel, new int[] { level1, level2 });
if (result == null)
{
return null;
}
//保存属性
this.SetDryContactFunctionToMemory(panel, result.privateFuncTypeLevelThirdList, level1, level2);
}
//从本地缓存当中获取它的私有属性
return this.GetDryContactFunctionFromLocation(panel, level1, level2);
}
///
/// 获取按键面板的功能
///
/// 按键面板的某一个回路
///
/// 方法1:当int[]传空,返回值是“面板具有的功能大类,即返回“第一级别。1024:灯类,256:按键类,768:PIR类
/// 方法2:、当int[]值为第一级别PrivateFuncTypeFir中选择一个。
/// 返回值是“面按键发送功能类”,即返回“第二级别。
/// 100:Switch,开关(按键类);200:Dimmer,调光(按键类);300:Curtain,窗帘(按键类)
/// 0:EnergySavingMode,节能模式(灯类);1:SleepMode,睡眠模式(灯类);100:WhiteBalance,白平衡(灯类);101:RGBColor,RGB指示灯颜色(灯类);102:RGBLevel,RGB指示灯亮度(灯类)
/// 方法3:当int[]值为第一级别PrivateFuncTypeFir中选择一个,接着再选第二级别PrivateFunTypeSec中选择一个
/// 返回值是“面按键具体功能配置”,即返回“第二级别。
/// 100:SwitchOpen,开关开(按键类);101:SwitchClose,开关关(按键类);102:SwitchChange,开关切换(按键类)
/// 200:DimmerStepUp,增大调光(按键类);201:DimmerStepDown,降低调光(按键类);202:DimmerStepChange,调光切换(按键类)
/// 300:CurtainOpen,窗帘开(按键类);301:CurtainClose,窗帘关(按键类);302:CurtainStop,窗帘停;303:CurtainUpStop,窗帘上升停;304:CurtainDownstop,窗帘下降停
///
///
private async Task GetDryContactFunctionInterface(Panel panel, params int[] parameter)
{
var result = await panel.GetPanelPrivateFunctionsAsync(parameter);
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowErrorMsg(error);
return null;
}
if (result == null || result.panelPrivateFunctionsResponseInfo == null)
{
//获取按键功能类信息失败
string msg = Language.StringByID(R.MyInternationalizationString.uGetPanelFunctionInfoFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return null;
}
return result.panelPrivateFunctionsResponseInfo;
}
#endregion
#region ■ 修改干接点私有属性_________________
///
/// 修改干接点私有属性
///
/// 干接点对象
/// 干接点的第三级别属性的值,具体请参照第三级别属性
///
public async Task EditorDryContactFunction(Panel panel, int i_value)
{
var result = await panel.ConfigureHdlKeyValueAsync((Panel.KeyMode)i_value);
//共通错误检测
string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
if (error != null)
{
this.ShowErrorMsg(error);
return false;
}
if (result == null || result.setWritableValueResponData == null)
{
//设备属性变更失败
string msg = Language.StringByID(R.MyInternationalizationString.uDeviceAttributeChangedFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return false;
}
if (result.setWritableValueResponData.Status == 134)
{
//设备不支持此属性(XXX)
string msg = Language.StringByID(R.MyInternationalizationString.uDeviceNotSupportTheAttribute);
msg += "(" + i_value + ")";
this.ShowErrorMsg(msg);
return false;
}
if (result.setWritableValueResponData.Status == 135)
{
//无效的设备属性值(XXX)
string msg = Language.StringByID(R.MyInternationalizationString.uDeviceAttributeIsIneffectiveness);
msg += "(" + i_value + ")";
this.ShowErrorMsg(msg);
return false;
}
if (result.setWritableValueResponData.Status == 141)
{
//无效的数据类型(XXX)
string msg = Language.StringByID(R.MyInternationalizationString.uDataTypeIsIneffectiveness);
msg += "(" + i_value + ")";
this.ShowErrorMsg(msg);
return false;
}
if (result.setWritableValueResponData.Status != 0)
{
//设备属性变更失败
string msg = Language.StringByID(R.MyInternationalizationString.uDeviceAttributeChangedFail);
this.ShowErrorMsg(msg);
return false;
}
//备份设备
await HdlGatewayLogic.Current.UpLoadDeviceBackupDataToGateway(panel, GatewayBackupEnum.A干接点私有属性, i_value);
return true;
}
#endregion
#region ■ 简约面板震动功能___________________
///
/// 获取简约面板震动功能的信息(null表示出错)
///
/// 某一回路
///
public VibrationInfo GetPanelVibrationData(CommonDevice device)
{
var returnData = new VibrationInfo();
var gateway = device.Gateway;
if (gateway == null)
{
//错误:网关对象丢失
this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
return null;
}
string checkTopic = HdlGatewayLogic.Current.GetGatewayId(gateway) + "/" + "ZbDataPassthrough";
bool canBreak = false;
Action action = (topic, message) =>
{
if (topic == checkTopic)
{
try
{
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
string PassData = jobject["Data"]["PassData"].ToString();
if (PassData.Length != 18)
{
return;
}
string mytopic = PassData[4].ToString() + PassData[5].ToString() + PassData[2].ToString() + PassData[3].ToString();
if (mytopic != "0802")
{
return;
}
returnData.A震动使能 = PassData.Substring(10, 2) == "01" ? true : false;
returnData.A震动强度 = Convert.ToInt32(PassData.Substring(12, 2), 16);
returnData.A震动时间 = Convert.ToInt32(PassData.Substring(14, 4), 16);
canBreak = true;
}
catch { }
}
};
gateway.Actions += action;
try
{
var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
var data = new Newtonsoft.Json.Linq.JObject { { "PassData", "050108110101" } };
jObject.Add("Data", data);
gateway.Send(("ClientDataPassthrough"), jObject.ToString());
}
catch { }
int TimeOut = 0;
while (canBreak == false && TimeOut < 60)
{
System.Threading.Thread.Sleep(100);
TimeOut++;
}
gateway.Actions -= action;
if (TimeOut >= 60)
{
//获取震动反馈配置信息失败
string errorMsg = Language.StringByID(R.MyInternationalizationString.uGetVibrationFeedbackSettionFail);
errorMsg = UserCenterLogic.CombineGatewayTimeOutMsg(errorMsg, null, "回复超时", false);
this.ShowTipMsg(errorMsg);
return null;
}
return returnData;
}
///
/// 设置简约面板震动功能的信息
///
/// 某一回路
/// 设置的信息
///
public bool SetPanelVibrationData(CommonDevice device, VibrationInfo datainfo)
{
var gateway = device.Gateway;
if (gateway == null)
{
//错误:网关对象丢失
this.ShowTipMsg(Language.StringByID(R.MyInternationalizationString.uErrorGatewayLostMsg));
return false;
}
string checkTopic = HdlGatewayLogic.Current.GetGatewayId(gateway) + "/" + "ZbDataPassthrough";
bool canBreak = false;
bool success = false;
Action action = (topic, message) =>
{
if (topic == checkTopic)
{
try
{
var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
if (jobject["DeviceAddr"].ToString() != device.DeviceAddr)
{
//不是同一个东西
return;
}
string PassData = jobject["Data"]["PassData"].ToString();
if (PassData.Length != 16)
{
return;
}
string mytopic = PassData[4].ToString() + PassData[5].ToString() + PassData[2].ToString() + PassData[3].ToString();
if (mytopic != "0002")
{
return;
}
int command = Convert.ToInt32(PassData[10].ToString() + PassData[11].ToString() + PassData[12].ToString() + PassData[13].ToString(), 16);
int status = Convert.ToInt32(PassData[14].ToString() + PassData[15].ToString(), 16);
if (status == 0)
{
//成功
success = true;
}
canBreak = true;
}
catch { }
}
};
gateway.Actions += action;
try
{
string passData = "0800081104";
passData += datainfo.A震动使能 ? "01" : "00";
passData += Convert.ToString(datainfo.A震动强度, 16).PadLeft(2, '0');
string time = Convert.ToString(datainfo.A震动时间, 16).PadLeft(4, '0');
//低位在前,高位在后
passData += time.Substring(2, 2);
passData += time.Substring(0, 2);
var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
var data = new Newtonsoft.Json.Linq.JObject { { "PassData", passData } };
jObject.Add("Data", data);
gateway.Send(("ClientDataPassthrough"), jObject.ToString());
}
catch { }
int TimeOut = 0;
while (canBreak == false && TimeOut < 60)
{
System.Threading.Thread.Sleep(100);
TimeOut++;
}
gateway.Actions -= action;
if (success == false)
{
//设置震动反馈配置信息失败
string errorMsg = Language.StringByID(R.MyInternationalizationString.uSetVibrationFeedbackSettionFail);
if (TimeOut >= 60)
{
errorMsg = UserCenterLogic.CombineGatewayTimeOutMsg(errorMsg, null, "回复超时", false);
}
this.ShowTipMsg(errorMsg);
}
return success;
}
///
/// 简约面板震动功能信息
///
public class VibrationInfo
{
///
/// 震动使能
///
public bool A震动使能 = false;
///
/// 震动强度(十进制)
///
public int A震动强度 = 0;
///
/// 震动时间(十进制)
///
public int A震动时间 = 0;
}
#endregion
#region ■ 缓存中的设备私有属性_______________
///
/// 从缓存中获取设备的私有属性
///
///
///
///
///
private List GetDryContactFunctionFromLocation(Panel panel, int level1 = -1, int level2 = -1)
{
string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(panel);
if (dicDryContactFunction.ContainsKey(mainkeys) == false)
{
return null;
}
var listLevel = new List();
var functionInfo = dicDryContactFunction[mainkeys];
//第一级别
if (level1 == -1)
{
if (functionInfo.listLevel1 == null)
{
//第一级别从来都没有获取过
return null;
}
listLevel.AddRange(functionInfo.listLevel1);
}
//第二级别
else if (level2 == -1)
{
if (functionInfo.dicLevel2.ContainsKey(level1) == false)
{
//第二级别从来都没有获取过
return null;
}
listLevel.AddRange(functionInfo.dicLevel2[level1]);
}
//第三级别
else
{
if (functionInfo.dicLevel3.ContainsKey(level2) == false)
{
//第三级别从来都没有获取过
return null;
}
listLevel.AddRange(functionInfo.dicLevel3[level2]);
}
return listLevel;
}
///
/// 将设备的私有属性存入缓存中
///
///
///
///
///
private void SetDryContactFunctionToMemory(Panel panel, List listLevel, int level1, int level2)
{
string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(panel);
if (dicDryContactFunction.ContainsKey(mainkeys) == false)
{
//创建对象
dicDryContactFunction[mainkeys] = new DryContactFunctionInfo();
}
var functionInfo = dicDryContactFunction[mainkeys];
//第一级别
if (level1 == -1)
{
//这个属性应该是不会变的
functionInfo.listLevel1 = new List();
functionInfo.listLevel1.AddRange(listLevel);
}
//第二级别
else if (level2 == -1)
{
if (functionInfo.dicLevel2.ContainsKey(level1) == false)
{
functionInfo.dicLevel2[level1] = new List();
}
functionInfo.dicLevel2[level1].Clear();
functionInfo.dicLevel2[level1].AddRange(listLevel);
}
//第三级别
else
{
if (functionInfo.dicLevel3.ContainsKey(level2) == false)
{
//初始化容器
functionInfo.dicLevel3[level2] = new List();
}
//第三级别的属性有可能会变更
functionInfo.dicLevel3[level2].Clear();
functionInfo.dicLevel3[level2].AddRange(listLevel);
}
//保存现阶段的干接点的私有属性到本地文件
this.SaveDryContactFunctionToLocaltion();
}
///
/// 保存现阶段的干接点的私有属性到本地文件
///
private void SaveDryContactFunctionToLocaltion()
{
var file = Newtonsoft.Json.JsonConvert.SerializeObject(dicDryContactFunction);
var bytes = System.Text.Encoding.UTF8.GetBytes(file);
Common.Global.WriteFileByBytesByHomeId(DirNameResourse.DryContactFunctionFile, bytes);
}
///
/// 从本地文件还原干接点的私有属性
///
private void LoadDryContactFunctionFromLocaltion()
{
if (Common.Global.IsExistsByHomeId(DirNameResourse.DryContactFunctionFile) == false)
{
return;
}
byte[] filebyte = Common.Global.ReadFileByHomeId(DirNameResourse.DryContactFunctionFile);
string strvalue = System.Text.Encoding.UTF8.GetString(filebyte);
this.dicDryContactFunction = Newtonsoft.Json.JsonConvert.DeserializeObject>(strvalue);
}
#endregion
#region ■ 一般方法___________________________
///
/// 显示错误信息窗口
///
///
private void ShowErrorMsg(string msg)
{
Application.RunOnMainThread(() =>
{
var contr = new ShowMsgControl(ShowMsgType.Error, msg);
contr.Show();
});
}
///
/// 显示Tip信息窗口
///
///
private void ShowTipMsg(string msg)
{
Application.RunOnMainThread(() =>
{
var contr = new ShowMsgControl(ShowMsgType.Tip, msg);
contr.Show();
});
}
#endregion
#region ■ 结构体_____________________________
///
/// 干接点功能信息
///
private class DryContactFunctionInfo
{
///
/// 第一级别(注意,这个东西和【dicLevel2,dicLevel3】不同步,因为它遵从于获取后才保存的原则)
///
public List listLevel1 = null;
///
/// 第二级别(主键为第一级别。注意,这个东西和【listLevel1,dicLevel3】不同步,因为它遵从于获取后才保存的原则)
///
public Dictionary> dicLevel2 = new Dictionary>();
///
/// 第三级别(主键为第二级别。注意,这个东西和【listLevel1,dicLevel2】不同步,因为它遵从于获取后才保存的原则)
///
public Dictionary> dicLevel3 = new Dictionary>();
}
#endregion
}
}