using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Threading;
|
using HDL_ON.DAL;
|
using HDL_ON.DAL.Server;
|
|
namespace HDL_ON.Entity
|
{
|
public class FunctionList
|
{
|
static FunctionList _FunctionList;
|
public static FunctionList List
|
{
|
get
|
{
|
if(_FunctionList == null)
|
{
|
_FunctionList = new FunctionList();
|
#region 恢复数据
|
var filePathList = Common.FileUtlis.Files.ReadFiles();
|
foreach (var filePath in filePathList)
|
{
|
_FunctionList.IniFunctionList(filePath);
|
}
|
#endregion
|
}
|
return _FunctionList;
|
}
|
}
|
|
/// <summary>
|
/// 空调列表
|
/// </summary>
|
public List<AC> aCs = new List<AC>();
|
/// <summary>
|
/// 灯光列表
|
/// </summary>
|
public List<Light> lights = new List<Light>();
|
/// <summary>
|
/// 窗帘列表
|
/// </summary>
|
public List<Curtain> curtains = new List<Curtain>();
|
/// <summary>
|
/// 地热列表
|
/// </summary>
|
public List<FloorHeating> floorHeatings = new List<FloorHeating>();
|
#region 家电列表 electricals
|
/// <summary>
|
/// 家电列表
|
/// </summary>
|
public List<Function> electricals
|
{
|
get
|
{
|
if(fans == null)
|
{
|
fans = new List<Fan>();
|
}
|
if(switchSockets == null)
|
{
|
switchSockets = new List<SwitchSocket>();
|
}
|
if(tVs == null)
|
{
|
tVs = new List<TV>();
|
}
|
var list = new List<Function>();
|
list.AddRange(fans);
|
list.AddRange(switchSockets);
|
list.AddRange(tVs);
|
return list;
|
}
|
}
|
/// <summary>
|
/// 风扇列表
|
/// </summary>
|
public List<Fan> fans = new List<Fan>();
|
/// <summary>
|
/// 电视列表
|
/// </summary>
|
public List<TV> tVs = new List<TV>();
|
/// <summary>
|
/// 家电列表
|
/// </summary>
|
public List<SwitchSocket> switchSockets = new List<SwitchSocket>();
|
#endregion
|
/// <summary>
|
/// 环境传感器列表
|
/// </summary>
|
public List<Sensor> sensorsEnvironmentalScience = new List<Sensor>();
|
|
/// <summary>
|
/// 场景列表
|
/// </summary>
|
public List<Scene> scenes = new List<Scene>();
|
/// <summary>
|
/// 功能列表
|
/// </summary>
|
List<Function> deviceFunctionList;
|
|
|
/// <summary>
|
/// 加载功能列表
|
/// todo 需要优化,后期不能保证能使用sid解析出是什么类型的设备
|
/// </summary>
|
/// <param name="filePath"></param>
|
public void IniFunctionList(string filePath)
|
{
|
if (filePath.StartsWith("FunctionData_"))
|
{
|
var functionDataBytes = Common.FileUtlis.Files.ReadFile(filePath);
|
var functionDataString = System.Text.Encoding.UTF8.GetString(functionDataBytes);
|
var tempFunction = Newtonsoft.Json.JsonConvert.DeserializeObject<Function>(functionDataString);
|
if (tempFunction == null)
|
{
|
Common.FileUtlis.Files.DeleteFile(filePath);
|
return;
|
}
|
if (tempFunction.DeleteSign)
|
{
|
//todo 删除云端数据 20201203--App不能删除功能数据
|
}
|
else
|
{
|
switch (tempFunction.spk)
|
{
|
case SPK.LightSwitch:
|
case SPK.LightDimming:
|
case SPK.LightRGB:
|
case SPK.LightRGBW:
|
case SPK.LightCCT:
|
_FunctionList.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Light>(functionDataString));
|
break;
|
case SPK.CurtainRoller:
|
case SPK.CurtainShades:
|
case SPK.CurtainSwitch:
|
case SPK.CurtainTrietex:
|
_FunctionList.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Curtain>(functionDataString));
|
break;
|
case SPK.AcStandard:
|
_FunctionList.aCs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<AC>(functionDataString));
|
break;
|
case SPK.FloorHeatStandard:
|
//恢复地热数据
|
_FunctionList.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<FloorHeating>(functionDataString));
|
break;
|
case SPK.SensorPm25:
|
case SPK.SensorCO2:
|
case SPK.SensorTVOC:
|
case SPK.SensorTemperature:
|
case SPK.SensorHumidity:
|
//恢复环境数据
|
_FunctionList.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Sensor>(functionDataString));
|
break;
|
case SPK.ElectricSocket:
|
//恢复插座数据
|
_FunctionList.switchSockets.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<SwitchSocket>(functionDataString));
|
break;
|
case SPK.ElectricTV:
|
//恢复电视数据
|
_FunctionList.tVs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<TV>(functionDataString));
|
break;
|
case SPK.ElectricFan:
|
//恢复风扇数据
|
_FunctionList.fans.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Fan>(functionDataString));
|
break;
|
}
|
}
|
}
|
if (filePath.StartsWith("SceneData_"))
|
{
|
var sceneDataBytes = Common.FileUtlis.Files.ReadFile(filePath);
|
var sceneDataString = System.Text.Encoding.UTF8.GetString(sceneDataBytes);
|
var tempScene = Newtonsoft.Json.JsonConvert.DeserializeObject<Scene>(sceneDataString);
|
List.scenes.Add(tempScene);
|
}
|
}
|
|
|
/// <summary>
|
/// 获取所有功能列表
|
/// </summary>
|
public List<Function> GetAllFunction()
|
{
|
var fs = new List<Function>();
|
fs.AddRange(GetAllDeviceFunctionList());
|
return fs;
|
}
|
|
/// <summary>
|
/// 获取设备功能列表
|
/// </summary>
|
public List<Function> GetAllDeviceFunctionList()
|
{
|
//if (deviceFunctionList == null)
|
{
|
deviceFunctionList = new List<Function>();
|
deviceFunctionList.AddRange(aCs);
|
deviceFunctionList.AddRange(lights);
|
deviceFunctionList.AddRange(curtains);
|
deviceFunctionList.AddRange(floorHeatings);
|
deviceFunctionList.AddRange(electricals);
|
deviceFunctionList.AddRange(sensorsEnvironmentalScience);
|
deviceFunctionList.AddRange(UI.Music.A31MusicModel.A31MusicModelList);
|
}
|
try
|
{
|
deviceFunctionList.OrderByDescending(o => o.usageCount).ToList();
|
}
|
catch (Exception ex)
|
{
|
MainPage.Log($"设备功能排序异常:{ex.Message}");
|
}
|
return deviceFunctionList;
|
}
|
/// <summary>
|
/// 清空设备功能列表
|
/// </summary>
|
public void ClearAllDeviceFunctionList()
|
{
|
aCs = new List<AC>();
|
lights = new List<Light>();
|
curtains = new List<Curtain>();
|
floorHeatings = new List<FloorHeating>();
|
tVs = new List<TV>();
|
switchSockets = new List<SwitchSocket>();
|
fans = new List<Fan>();
|
sensorsEnvironmentalScience = new List<Sensor>();
|
scenes = new List<Scene>();
|
deviceFunctionList = null;
|
}
|
|
/// <summary>
|
/// 接收bus软件上传的功能
|
/// tcp方式
|
/// </summary>
|
/// <param name="sidObj"></param>
|
public void AddDeviceFunction(Function sidObj0)
|
{
|
switch (sidObj0.functionType)
|
{
|
case FunctionType.AC:
|
var sidObj = Newtonsoft.Json.JsonConvert.DeserializeObject<AC>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.aCs.Add(sidObj);
|
sidObj.SaveFunctionData(false);
|
break;
|
case FunctionType.FloorHeating:
|
var sidObj1 = Newtonsoft.Json.JsonConvert.DeserializeObject<FloorHeating>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.floorHeatings.Add(sidObj1);
|
sidObj1.SaveFunctionData(false);
|
break;
|
case FunctionType.Dimmer:
|
case FunctionType.RGB:
|
case FunctionType.Relay:
|
var sidObj2 = Newtonsoft.Json.JsonConvert.DeserializeObject<Light>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.lights.Add(sidObj2);
|
sidObj2.SaveFunctionData(false);
|
break;
|
case FunctionType.Curtain:
|
case FunctionType.RollingShutter:
|
case FunctionType.MotorCurtain:
|
var sidObj3 = Newtonsoft.Json.JsonConvert.DeserializeObject<Curtain>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.curtains.Add(sidObj3 );
|
sidObj3.SaveFunctionData(false);
|
break;
|
case FunctionType.TV:
|
var sidObj4 = Newtonsoft.Json.JsonConvert.DeserializeObject<TV>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.tVs.Add(sidObj4);
|
sidObj4.SaveFunctionData(false);
|
break;
|
case FunctionType.Socket:
|
var sidObj5 = Newtonsoft.Json.JsonConvert.DeserializeObject<SwitchSocket>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.switchSockets.Add(sidObj5);
|
sidObj5.SaveFunctionData(false);
|
break;
|
case FunctionType.Fan:
|
var sidObj6 = Newtonsoft.Json.JsonConvert.DeserializeObject<Fan>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.fans.Add(sidObj6);
|
sidObj6.SaveFunctionData(false);
|
break;
|
case FunctionType.CO2:
|
case FunctionType.TVOC:
|
case FunctionType.PM25:
|
case FunctionType.Temp:
|
case FunctionType.Humidity:
|
var sidObj7 = Newtonsoft.Json.JsonConvert.DeserializeObject<Sensor>(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
|
DB_ResidenceData.functionList.sensorsEnvironmentalScience.Add(sidObj7);
|
sidObj7.SaveFunctionData(false);
|
break;
|
}
|
}
|
/// <summary>
|
/// 接收bus软件上传的功能
|
/// http udp
|
/// </summary>
|
/// <param name="obj"></param>
|
public void AddFunction(object obj)
|
{
|
var f = Newtonsoft.Json.JsonConvert.DeserializeObject<Function>(obj.ToString());
|
if (f == null)
|
return;
|
switch (f.functionCategory)
|
{
|
case FunctionCategory.Thermostat:
|
switch (f.functionType)
|
{
|
case FunctionType.AC:
|
_FunctionList.aCs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<AC>(obj.ToString()));
|
break;
|
case FunctionType.FloorHeating:
|
_FunctionList.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<FloorHeating>(obj.ToString()));
|
break;
|
}
|
break;
|
case FunctionCategory.Light:
|
_FunctionList.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Light>(obj.ToString()));
|
break;
|
case FunctionCategory.Curtain:
|
_FunctionList.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Curtain>(obj.ToString()));
|
break;
|
case FunctionCategory.Electrical:
|
switch(f.functionType)
|
{
|
case FunctionType.TV:
|
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<TV>(obj.ToString()));
|
break;
|
case FunctionType.Socket:
|
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<SwitchSocket>(obj.ToString()));
|
break;
|
case FunctionType.Fan:
|
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Fan>(obj.ToString()));
|
break;
|
}
|
break;
|
case FunctionCategory.Sensor:
|
switch(f.functionType)
|
{
|
case FunctionType.TVOC:
|
case FunctionType.CO2:
|
case FunctionType.PM25:
|
case FunctionType.Humidity:
|
case FunctionType.Temp:
|
_FunctionList.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject<Sensor>(obj.ToString()));
|
break;
|
}
|
break;
|
}
|
}
|
|
/// <summary>
|
/// 功能绑定房间
|
/// </summary>
|
public string FunctionsBindRooms(List<string> roomIds,List<string> deviceIds)
|
{
|
var pm = new HttpServerRequest();
|
var pack = pm.BindDeviceToRoom(deviceIds, roomIds);
|
if(pack.Code == StateCode.SUCCESS)
|
{
|
|
}
|
else
|
{
|
Utlis.ShowTip(Shared.Language.StringByID(StringId.EditFunctionInfoFail) + "\r\nCode:" + pack.Code);
|
}
|
return pack.Code;
|
}
|
|
/// <summary>
|
/// 下来云端设备数据
|
/// </summary>
|
public void DownloadFunctionList()
|
{
|
new Thread(() =>
|
{
|
var pm = new HttpServerRequest();
|
var pack = pm.GetDeviceList();
|
if (pack.Code == StateCode.SUCCESS)
|
{
|
var deviceList = Newtonsoft.Json.JsonConvert.DeserializeObject<DevcieApiPack>(pack.Data.ToString());
|
if (deviceList != null)
|
{
|
////将下载到到数据全部保存
|
//new Thread(() => {
|
// foreach (var temp in deviceList.list)
|
// {
|
// temp.SaveFunctionData();
|
// }
|
//})
|
//{ IsBackground = true }.Start();
|
for (int i =0;i < List.GetAllDeviceFunctionList().Count;)
|
{
|
var localFunction = List.GetAllDeviceFunctionList()[i];
|
var newFunction = deviceList.list.Find((obj) => obj.deviceId == localFunction.deviceId);
|
if (newFunction == null)//如果云端最新数据没有该条数据,则本地需要删掉该数据记录
|
{
|
List.DeleteFunction(localFunction);
|
}
|
else
|
{
|
i++;
|
if (localFunction.modifyTime != newFunction.modifyTime)
|
{
|
localFunction.name = newFunction.name;
|
localFunction.collect = newFunction.collect;
|
localFunction.modifyTime = newFunction.modifyTime;
|
localFunction.roomIds = newFunction.roomIds;
|
localFunction.bus_Data = newFunction.bus_Data;
|
localFunction.SaveFunctionData(false);
|
}
|
deviceList.list.Remove(newFunction);//操作完的数据清理掉,剩下的就是新增的功能
|
}
|
}
|
//处理剩下的新增功能
|
foreach (var newFunction in deviceList.list)
|
{
|
newFunction.SaveFunctionData(false);
|
List.IniFunctionList(newFunction.savePath);
|
}
|
}
|
//MainPage.Log($"读取云端设备数据:\r\n{ pack.Data.ToString()}");
|
}
|
else
|
{
|
MainPage.Log($"读取云端设备数据失败:\r\nCode:{pack.Code}; Msg:{pack.message}");
|
}
|
})
|
{ IsBackground = true }.Start();
|
}
|
|
/// <summary>
|
/// 下载云端场景数据
|
/// </summary>
|
public void DownloadSceneList()
|
{
|
new Thread(() =>
|
{
|
var pm = new HttpServerRequest();
|
var pack = pm.GetSceneList();
|
if(pack.Code == StateCode.SUCCESS)
|
{
|
//MainPage.Log($"读取云端场景数据:\r\n{pack.Data.ToString()}");
|
var sceneList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Scene>>(pack.Data.ToString());
|
if (sceneList != null)
|
{
|
////将下载到到数据全部保存
|
//new Thread(() => {
|
// foreach (var temp in sceneList)
|
// {
|
// temp.SaveSceneData();
|
// }
|
//})
|
//{ IsBackground = true }.Start();
|
for(int i=0;i<List.scenes.Count;)
|
{
|
var localScene = List.scenes[i];
|
var newScene = sceneList.Find((obj) => obj.userSceneId == localScene.userSceneId);
|
if (newScene == null)//如果云端最新数据没有该条数据,则本地需要删掉该数据记录
|
{
|
List.DeleteScene(localScene,false);
|
}
|
else
|
{
|
i++;
|
if (localScene.modifyTime != newScene.modifyTime)
|
{
|
localScene.name = newScene.name;
|
localScene.collect = newScene.collect;
|
localScene.modifyTime = newScene.modifyTime;
|
localScene.roomIds = newScene.roomIds;
|
localScene.SaveSceneData(false);
|
}
|
sceneList.Remove(newScene);//操作完的数据清理掉,剩下的就是新增的功能
|
}
|
}
|
//处理剩下的新增功能
|
foreach (var newScene in sceneList)
|
{
|
newScene.SaveSceneData(false);
|
List.scenes.Add(newScene);
|
}
|
}
|
}
|
else
|
{
|
MainPage.Log($"读取云端场景数据失败:\r\nCode:{pack.Code}; Msg:{pack.message}");
|
}
|
})
|
{ IsBackground = true }.Start();
|
}
|
|
|
/// <summary>
|
/// 删除手机存储都所有缓存功能数据
|
/// </summary>
|
public void DelAllFunctionData()
|
{
|
var filePathList = Common.FileUtlis.Files.ReadFiles();
|
foreach (var filePath in filePathList)
|
{
|
if (filePath.StartsWith("FunctionData_") && filePath.Length == 13 + 28)
|
{
|
Common.FileUtlis.Files.DeleteFile(filePath);
|
}
|
}
|
_FunctionList = new FunctionList();
|
}
|
/// <summary>
|
/// 删除场景
|
/// </summary>
|
public void DeleteScene(Scene scene,bool upSevser)
|
{
|
if (upSevser)
|
{
|
var pm = new HttpServerRequest();
|
var packCode = pm.DeleteScene(scene.userSceneId);
|
if (packCode == StateCode.SUCCESS)
|
{
|
Common.FileUtlis.Files.DeleteFile(scene.savePath);
|
List.scenes.Remove(scene);
|
}
|
else
|
{
|
Utlis.ShowTip(Shared.Language.StringByID(StringId.DeleteSceneFail) + "Code:" + packCode);
|
}
|
}
|
else
|
{
|
Common.FileUtlis.Files.DeleteFile(scene.savePath);
|
List.scenes.Remove(scene);
|
}
|
}
|
/// <summary>
|
/// 删除本地功能文件
|
/// </summary>
|
public void DeleteFunction(Function delTemp)
|
{
|
switch (delTemp.spk)
|
{
|
case SPK.LightSwitch:
|
case SPK.LightDimming:
|
case SPK.LightRGB:
|
case SPK.LightRGBW:
|
case SPK.LightCCT:
|
_FunctionList.lights.Remove(_FunctionList.lights.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
case SPK.CurtainRoller:
|
case SPK.CurtainShades:
|
case SPK.CurtainSwitch:
|
case SPK.CurtainTrietex:
|
_FunctionList.curtains.Remove(_FunctionList.curtains.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
case SPK.AcStandard:
|
_FunctionList.aCs.Remove(_FunctionList.aCs.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
case SPK.FloorHeatStandard:
|
_FunctionList.floorHeatings.Remove(_FunctionList.floorHeatings.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
case SPK.SensorPm25:
|
case SPK.SensorCO2:
|
case SPK.SensorTVOC:
|
case SPK.SensorTemperature:
|
case SPK.SensorHumidity:
|
_FunctionList.sensorsEnvironmentalScience.Remove(_FunctionList.sensorsEnvironmentalScience.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
case SPK.ElectricSocket:
|
_FunctionList.switchSockets.Remove(_FunctionList.switchSockets.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
case SPK.ElectricTV:
|
_FunctionList.tVs.Remove(_FunctionList.tVs.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
case SPK.ElectricFan:
|
_FunctionList.fans.Remove(_FunctionList.fans.Find((obj) => obj.deviceId == delTemp.deviceId));
|
break;
|
}
|
Common.FileUtlis.Files.DeleteFile(delTemp.savePath);
|
}
|
|
bool lockReadFunctionStatus = false;
|
/// <summary>
|
/// 读取全部功能的状态
|
/// </summary>
|
public void ReadAllFunctionStatus()
|
{
|
if (lockReadFunctionStatus)
|
{
|
MainPage.Log($"多次进入--返回");
|
return;
|
}
|
new Thread(() =>
|
{
|
if (lockReadFunctionStatus)
|
{
|
MainPage.Log($"多次进入--返回");
|
return;
|
}
|
MainPage.Log($"进入--读取");
|
lockReadFunctionStatus = true;
|
try
|
{
|
if (DriverLayer.Control.Ins.IsRemote)
|
{
|
var functionIds = new List<string>();
|
foreach (var function in GetAllDeviceFunctionList())
|
{
|
functionIds.Add(function.deviceId);
|
}
|
DriverLayer.Control.Ins.SendApiReadCommand(functionIds);
|
}
|
else
|
{
|
foreach (var function in GetAllDeviceFunctionList())
|
{
|
switch (function.functionCategory)
|
{
|
case FunctionCategory.Light:
|
case FunctionCategory.Electrical:
|
case FunctionCategory.SwitchDevice:
|
case FunctionCategory.Curtain:
|
case FunctionCategory.Thermostat:
|
DriverLayer.Control.Ins.SendReadCommand(function);
|
break;
|
}
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
MainPage.Log($"Refresh Residence Function Status Error : {ex.Message}");
|
}
|
finally
|
{
|
lockReadFunctionStatus = false;
|
MainPage.Log($"结束--读取");
|
}
|
})
|
{ IsBackground = true }.Start();
|
}
|
|
}
|
|
}
|