using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using ZigBee.Device;
|
using System.Threading.Tasks;
|
using Newtonsoft.Json.Linq;
|
|
namespace Shared.Phone
|
{
|
/// <summary>
|
/// PIR传感器的逻辑
|
/// </summary>
|
public class HdlDevicePirSensorLogic
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// PIR传感器的逻辑
|
/// </summary>
|
private static HdlDevicePirSensorLogic m_Current = null;
|
/// <summary>
|
/// PIR传感器的逻辑
|
/// </summary>
|
public static HdlDevicePirSensorLogic Current
|
{
|
get
|
{
|
if (m_Current == null)
|
{
|
m_Current = new HdlDevicePirSensorLogic();
|
}
|
return m_Current;
|
}
|
}
|
#endregion
|
|
#region ■ 光感等级总刻度_____________________
|
|
/// <summary>
|
/// 获取PIR传感器的【光感等级总刻度】,错误时返回-1
|
/// </summary>
|
/// <param name="iASZone"></param>
|
/// <returns></returns>
|
public async Task<int> GetPirLightAbilitySize(IASZone iASZone)
|
{
|
//如果当前住宅是虚拟住宅
|
if (Common.Config.Instance.Home.IsVirtually == true)
|
{
|
return 100;
|
}
|
var data = await iASZone.GetPIRLightAbilitySizeAsync();
|
//共通错误检测
|
string error = HdlCheckLogic.Current.CheckGatewayErrorCode(data);
|
if (error != null)
|
{
|
this.ShowErrorMsg(error);
|
return -1;
|
}
|
|
if (data == null || data.errorMessageBase != null || data.LightLevelCount == -1)
|
{
|
//获取传感器光感等级失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetPirSensorLightPerceptionRegulationFail);
|
//拼接上【网关回复超时】的Msg
|
msg = HdlCommonLogic.Current.CombineGatewayTimeOutMsg(msg, data);
|
|
this.ShowErrorMsg(msg);
|
return -1;
|
}
|
|
return data.LightLevelCount;
|
}
|
|
#endregion
|
|
#region ■ 获取配置信息_______________________
|
|
/// <summary>
|
/// 获取PIR传感器的【配置信息】,错误时返回null
|
/// </summary>
|
/// <param name="iASZone"></param>
|
/// <returns></returns>
|
public IASZone.ConfigureParamates GetPirSensorLightSettion(IASZone iASZone)
|
{
|
var data = this.GetPIRSensorParamateAsync(iASZone);
|
if (data == null || data.configureParamates == null)
|
{
|
//获取传感器设置信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetPirSensorSettionFail);
|
//拼接上【网关回复超时】的Msg
|
msg = HdlCommonLogic.Current.CombineGatewayTimeOutMsg(msg, data);
|
|
this.ShowErrorMsg(msg);
|
return null;
|
}
|
return data.configureParamates;
|
}
|
|
/// <summary>
|
/// 获取PIR传感器的【lux值】,错误时返回-1
|
/// </summary>
|
/// <param name="iASZone"></param>
|
/// <param name="mode"></param>
|
/// <returns></returns>
|
public async Task<int> GetPirSensorLux(IASZone iASZone, ShowErrorMode mode = ShowErrorMode.YES)
|
{
|
//如果当前住宅是虚拟住宅
|
if (Common.Config.Instance.Home.IsVirtually == true)
|
{
|
return 70;
|
}
|
var data = await iASZone.GetPirLuxAbilitySizeAsync();
|
if (data == null || data.pirLux == -1)
|
{
|
//获取传感器亮度值失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uGetPirSensorLuxFail);
|
//拼接上【网关回复超时】的Msg
|
msg = HdlCommonLogic.Current.CombineGatewayTimeOutMsg(msg, data);
|
if (mode == ShowErrorMode.YES)
|
{
|
this.ShowErrorMsg(msg);
|
}
|
return -1;
|
}
|
return data.pirLux;
|
}
|
|
///<summary >
|
///PIR传感器参数配置
|
/// </summary>
|
public IASZone.ParamatesInfo GetPIRSensorParamateAsync(CommonDevice device)
|
{
|
//如果当前住宅是虚拟住宅
|
if (Common.Config.Instance.Home.IsVirtually == true)
|
{
|
return HdlTemplateDeviceDataLogic.Current.GetPirSensorLightSettion(device.DeviceAddr, 200);
|
}
|
var sendData = this.GetPirSensorParamateCommadText(device.DeviceAddr);
|
var result = HdlDeviceCommonLogic.Current.SendJobjectDataToGateway2(device, sendData, "0302", 34, 9);
|
if (result.ErrorMsg != null || result.ErrorMsgDiv == 0)
|
{
|
return null;
|
}
|
var data = result.ReceiptData;
|
|
var tempD = new IASZone.ConfigureParamates();
|
|
var le = data[10].ToString() + data[11].ToString();
|
tempD.levelEnable = le == "01";
|
|
var size = data[12].ToString() + data[13].ToString();
|
tempD.levelSize = Convert.ToInt32(size, 16);
|
|
var cdl = data[14].ToString() + data[15].ToString();
|
tempD.controlDevEnable = cdl == "01";
|
|
tempD.transitionTime = Convert.ToInt32(data[18].ToString() + data[19].ToString() + data[16].ToString() + data[17].ToString(), 16);
|
tempD.iasReportPeriod = Convert.ToInt32(data[22].ToString() + data[23].ToString() + data[20].ToString() + data[21].ToString(), 16);
|
tempD.mode = Convert.ToInt32(data[24].ToString() + data[25].ToString(), 16);
|
tempD.type = Convert.ToInt32(data[26].ToString() + data[27].ToString(), 16);
|
tempD.dimmerOnTime = Convert.ToInt32(data[28].ToString() + data[29].ToString(), 16);
|
tempD.dimmerOffTime = Convert.ToInt32(data[30].ToString() + data[31].ToString(), 16);
|
tempD.dimmerLevel = Convert.ToInt32(data[32].ToString() + data[33].ToString(), 16);
|
|
return new IASZone.ParamatesInfo { configureParamates = tempD };
|
}
|
|
/// <summary>
|
/// 获取PIR传感器参数配置的命令字符
|
/// </summary>
|
/// <param name="device"></param>
|
/// <returns></returns>
|
private string GetPirSensorParamateCommadText(string DeviceAddr)
|
{
|
var passData = "050103010101";
|
var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
|
var data = new JObject { { "PassData", passData } };
|
jObject.Add("Data", data);
|
|
return jObject.ToString();
|
}
|
|
#endregion
|
|
#region ■ 设置配置信息_______________________
|
|
/// <summary>
|
/// 设置PIR传感器的【配置信息】
|
/// </summary>
|
/// <param name="device">传感器对象</param>
|
/// <param name="configure">灯光配置</param>
|
/// <returns></returns>
|
public bool SetPirSensorSettion(CommonDevice device, IASZone.ConfigureParamates configure)
|
{
|
var result = this.SetPIRSensorParamateAsync(device, configure);
|
if (result == null || result.responseData == null)
|
{
|
//设置传感器配置信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uSetPirSensorSettionFail);
|
//拼接上【网关回复超时】的Msg
|
msg = HdlCommonLogic.Current.CombineGatewayTimeOutMsg(msg, result);
|
|
this.ShowErrorMsg(msg);
|
return false;
|
}
|
if (result.responseData.status != 0)
|
{
|
//设置传感器配置信息失败
|
string msg = Language.StringByID(R.MyInternationalizationString.uSetPirSensorSettionFail);
|
this.ShowErrorMsg(msg);
|
return false;
|
}
|
|
return true;
|
}
|
|
/// <summary>
|
/// PIR传感器参数配置
|
/// </summary>
|
/// <param name="device"></param>
|
/// <param name="configureParamates"></param>
|
/// <returns></returns>
|
public IASZone.ResponseAllData SetPIRSensorParamateAsync(CommonDevice device, IASZone.ConfigureParamates configureParamates)
|
{
|
//如果是虚拟住宅
|
if (Common.Config.Instance.Home.IsVirtually == true)
|
{
|
return HdlTemplateDeviceDataLogic.Current.SetPirSensorLightSettion(device.DeviceAddr, 200, configureParamates, null);
|
}
|
//发送数据
|
var sendData = this.GetPirSensorSettionCommandText(device.DeviceAddr, configureParamates);
|
var result = HdlDeviceCommonLogic.Current.SendJobjectDataToGateway2(device, sendData, "0002", 16, 9);
|
if (result.ErrorMsg != null || result.ErrorMsgDiv == 0)
|
{
|
return null;
|
}
|
string data = result.ReceiptData;
|
var tempD = new IASZone.ResponseData();
|
tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString();
|
tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16);
|
|
//添加缓存
|
HdlTemplateDeviceDataLogic.Current.SetPirSensorLightSettion(device.DeviceAddr, 200, configureParamates, result.JsonData[0]);
|
|
return new CommonDevice.ResponseAllData { responseData = tempD };
|
}
|
|
/// <summary>
|
/// 获取修改PIR传感器配置的命令字符
|
/// </summary>
|
/// <param name="DeviceAddr"></param>
|
/// <param name="configureParamates"></param>
|
/// <returns></returns>
|
public string GetPirSensorSettionCommandText(string DeviceAddr, IASZone.ConfigureParamates configureParamates)
|
{
|
var passData = this.GetPIRSensorSettionPassData(configureParamates);
|
var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
|
var data = new JObject { { "PassData", passData } };
|
jObject.Add("Data", data);
|
|
return jObject.ToString();
|
}
|
|
/// <summary>
|
/// 获取修改PIR传感器配置的命令字符
|
/// </summary>
|
private string GetPIRSensorSettionPassData(IASZone.ConfigureParamates configureParamates)
|
{
|
string data = "";
|
string dataLength = "10";
|
string dataComand1 = "00";
|
string dataComand2 = "03";
|
string dataSerialNum = "01";
|
string addDataLength = "0C";
|
string levelEnable = "";
|
string levelSize = "";
|
string controlDevEnable = "";
|
string transitionTime = "";
|
string iasReportPeriod = "";
|
string mode = "";
|
string type = "";
|
string dimmerOnTime = "";
|
string dimmerOffTime = "";
|
try
|
{
|
if (configureParamates != null)
|
{
|
//levelEnable
|
if (configureParamates.levelEnable)
|
{
|
levelEnable = "01";
|
}
|
else
|
{
|
levelEnable = "00";
|
}
|
//光照等级
|
if (configureParamates.levelSize > 0)
|
{
|
var tempLevelEnable = Convert.ToString(configureParamates.levelSize, 16);
|
levelSize = tempLevelEnable.ToString().PadLeft(2, '0');
|
}
|
else
|
{
|
levelSize = "00";
|
}
|
//controlDevEnable
|
if (configureParamates.controlDevEnable)
|
{
|
controlDevEnable = "01";
|
}
|
else
|
{
|
controlDevEnable = "00";
|
}
|
//transitionTime,iasReportPeriod
|
for (int j = 0; j < 2; j++)
|
{
|
var tempBytes = new byte[2];
|
if (j == 0)
|
{
|
for (int i = 0; i < 2; i++)
|
{
|
tempBytes[i] = (byte)(configureParamates.transitionTime >> (i * 8) & 0xff);
|
}
|
}
|
else
|
{
|
for (int i = 0; i < 2; i++)
|
{
|
tempBytes[i] = (byte)(configureParamates.iasReportPeriod >> (i * 8) & 0xff);
|
}
|
}
|
var time1 = Convert.ToString(tempBytes[0], 16);
|
var time2 = Convert.ToString(tempBytes[1], 16);
|
if (time1.Length == 1)
|
{
|
time1 = "0" + time1;
|
}
|
if (time2.Length == 1)
|
{
|
time2 = "0" + time2;
|
}
|
if (j == 0)
|
{
|
transitionTime = (time1 + time2).ToUpper();
|
|
}
|
else
|
{
|
iasReportPeriod = (time1 + time2).ToUpper();
|
}
|
}
|
//mode
|
if (configureParamates.mode == 1)
|
{
|
mode = "01";
|
}
|
else
|
{
|
mode = "00";
|
}
|
//type
|
if (configureParamates.type == 1)
|
{
|
type = "01";
|
}
|
else
|
{
|
type = "00";
|
}
|
//dimmerOnTime
|
if (configureParamates.dimmerOnTime > 0)
|
{
|
var tempDimmerOnTime = Convert.ToString(configureParamates.dimmerOnTime, 16);
|
dimmerOnTime = tempDimmerOnTime.ToString().PadLeft(2, '0');
|
}
|
else
|
{
|
dimmerOnTime = "00";
|
}
|
dimmerOnTime = dimmerOnTime.ToUpper();
|
if (configureParamates.dimmerOffTime > 0)
|
{
|
var tempDimmerOffTime = Convert.ToString(configureParamates.dimmerOffTime, 16);
|
dimmerOffTime = tempDimmerOffTime.ToString().PadLeft(2, '0');
|
}
|
else
|
{
|
dimmerOffTime = "00";
|
}
|
dimmerOffTime = dimmerOffTime.ToUpper();
|
//dimmerLevel
|
string temp = "";
|
var sbString = new System.Text.StringBuilder();
|
string temp2 = Convert.ToString(configureParamates.dimmerLevel, 16);
|
switch (temp2.Length)
|
{
|
case 1:
|
temp = "0" + temp2;
|
break;
|
case 2:
|
temp = temp2;
|
break;
|
}
|
sbString.Append(temp.ToUpper());
|
|
data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
|
levelEnable + levelSize + controlDevEnable + transitionTime + iasReportPeriod
|
+ mode + type + dimmerOnTime + dimmerOffTime + sbString;
|
}
|
}
|
catch { };
|
|
return data;
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
/// <summary>
|
/// 显示错误信息窗口
|
/// </summary>
|
/// <param name="msg"></param>
|
private void ShowErrorMsg(string msg)
|
{
|
Application.RunOnMainThread(() =>
|
{
|
var contr = new ShowMsgControl(ShowMsgType.Error, msg);
|
contr.Show();
|
});
|
}
|
|
/// <summary>
|
/// 显示Tip信息窗口
|
/// </summary>
|
/// <param name="msg"></param>
|
private void ShowTipMsg(string msg)
|
{
|
Application.RunOnMainThread(() =>
|
{
|
var contr = new ShowMsgControl(ShowMsgType.Tip, msg);
|
contr.Show();
|
});
|
}
|
|
#endregion
|
}
|
}
|