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 = FileUtils.ReadFiles();
foreach (var filePath in filePathList)
{
_FunctionList.IniFunctionList(filePath);
}
#endregion
}
return _FunctionList;
}
}
///
/// 空调列表
///
public List aCs = new List();
///
/// 灯光列表
///
public List lights = new List();
///
/// 窗帘列表
///
public List curtains = new List();
///
/// 地热列表
///
public List floorHeatings = new List();
#region 家电列表 electricals
///
/// 家电列表
///
public List electricals
{
get
{
if(fans == null)
{
fans = new List();
}
if(switchSockets == null)
{
switchSockets = new List();
}
if(tVs == null)
{
tVs = new List();
}
var list = new List();
list.AddRange(fans);
list.AddRange(switchSockets);
list.AddRange(tVs);
return list;
}
}
///
/// 风扇列表
///
public List fans = new List();
///
/// 电视列表
///
public List tVs = new List();
///
/// 家电列表
///
public List switchSockets = new List();
#endregion
///
/// 环境传感器列表
///
public List sensorsEnvironmentalScience = new List();
///
/// 场景列表
///
public List scenes = new List();
///
/// 功能列表
///
List deviceFunctionList;
///
/// 加载功能列表
/// todo 需要优化,后期不能保证能使用sid解析出是什么类型的设备
///
///
public void IniFunctionList(string filePath)
{
if (filePath.StartsWith("FunctionData_"))
{
var functionDataBytes = FileUtils.ReadFile(filePath);
var functionDataString = System.Text.Encoding.UTF8.GetString(functionDataBytes);
var tempFunction = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
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(functionDataString));
break;
case SPK.CurtainRoller:
case SPK.CurtainShades:
case SPK.CurtainSwitch:
case SPK.CurtainTrietex:
_FunctionList.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString));
break;
case SPK.AcStandard:
_FunctionList.aCs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString));
break;
case SPK.FloorHeatStandard:
//恢复地热数据
_FunctionList.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString));
break;
case SPK.SensorPm25:
case SPK.SensorCO2:
case SPK.SensorTVOC:
case SPK.SensorTemperature:
case SPK.SensorHumidity:
//恢复环境数据
_FunctionList.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString));
break;
case SPK.ElectricSocket:
//恢复插座数据
_FunctionList.switchSockets.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString));
break;
case SPK.ElectricTV:
//恢复电视数据
_FunctionList.tVs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString));
break;
case SPK.ElectricFan:
//恢复风扇数据
_FunctionList.fans.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString));
break;
}
}
}
if (filePath.StartsWith("SceneData_"))
{
var sceneDataBytes = FileUtils.ReadFile(filePath);
var sceneDataString = System.Text.Encoding.UTF8.GetString(sceneDataBytes);
var tempScene = Newtonsoft.Json.JsonConvert.DeserializeObject(sceneDataString);
List.scenes.Add(tempScene);
}
}
///
/// 获取所有功能列表
///
public List GetAllFunction()
{
var fs = new List();
fs.AddRange(GetAllDeviceFunctionList());
return fs;
}
///
/// 获取设备功能列表
///
public List GetAllDeviceFunctionList()
{
//if (deviceFunctionList == null)
{
deviceFunctionList = new List();
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;
}
///
/// 清空设备功能列表
///
public void ClearAllDeviceFunctionList()
{
aCs = new List();
lights = new List();
curtains = new List();
floorHeatings = new List();
tVs = new List();
switchSockets = new List();
fans = new List();
sensorsEnvironmentalScience = new List();
scenes = new List();
deviceFunctionList = null;
}
///
/// 接收bus软件上传的功能
/// tcp方式
///
///
public void AddDeviceFunction(Function sidObj0)
{
switch (sidObj0.functionType)
{
case FunctionType.AC:
var sidObj = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
DB_ResidenceData.functionList.aCs.Add(sidObj);
sidObj.SaveFunctionData(false);
break;
case FunctionType.FloorHeating:
var sidObj1 = Newtonsoft.Json.JsonConvert.DeserializeObject(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(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(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
DB_ResidenceData.functionList.curtains.Add(sidObj3 );
sidObj3.SaveFunctionData(false);
break;
case FunctionType.TV:
var sidObj4 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
DB_ResidenceData.functionList.tVs.Add(sidObj4);
sidObj4.SaveFunctionData(false);
break;
case FunctionType.Socket:
var sidObj5 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
DB_ResidenceData.functionList.switchSockets.Add(sidObj5);
sidObj5.SaveFunctionData(false);
break;
case FunctionType.Fan:
var sidObj6 = Newtonsoft.Json.JsonConvert.DeserializeObject(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(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
DB_ResidenceData.functionList.sensorsEnvironmentalScience.Add(sidObj7);
sidObj7.SaveFunctionData(false);
break;
}
}
///
/// 接收bus软件上传的功能
/// http udp
///
///
public void AddFunction(object obj)
{
var f = Newtonsoft.Json.JsonConvert.DeserializeObject(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(obj.ToString()));
break;
case FunctionType.FloorHeating:
_FunctionList.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
}
break;
case FunctionCategory.Light:
_FunctionList.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionCategory.Curtain:
_FunctionList.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionCategory.Electrical:
switch(f.functionType)
{
case FunctionType.TV:
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionType.Socket:
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionType.Fan:
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(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(obj.ToString()));
break;
}
break;
}
}
///
/// 下来云端设备数据
///
public void DownloadFunctionList()
{
new Thread(() =>
{
var pm = new HttpServerRequest();
var pack = pm.GetDeviceList();
if (pack.Code == StateCode.SUCCESS)
{
var deviceList = Newtonsoft.Json.JsonConvert.DeserializeObject(pack.Data.ToString());
if (deviceList != null)
{
////将下载到到数据全部保存
//new Thread(() => {
// foreach (var temp in deviceList.list)
// {
// temp.SaveFunctionData();
// }
//})
//{ IsBackground = true }.Start();
foreach (var localFunction in List.GetAllDeviceFunctionList())
{
var newFunction = deviceList.list.Find((obj) => obj.deviceId == localFunction.deviceId);
if (newFunction == null)//如果云端最新数据没有该条数据,则本地需要删掉该数据记录
{
List.DeleteFunction(localFunction);
}
else
{
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();
}
///
/// 下载云端场景数据
///
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>(pack.Data.ToString());
if (sceneList != null)
{
////将下载到到数据全部保存
//new Thread(() => {
// foreach (var temp in sceneList)
// {
// temp.SaveSceneData();
// }
//})
//{ IsBackground = true }.Start();
foreach (var localScene in List.scenes)
{
var newScene = sceneList.Find((obj) => obj.userSceneId == localScene.userSceneId);
if (newScene == null)//如果云端最新数据没有该条数据,则本地需要删掉该数据记录
{
List.DeleteScene(localScene,false);
}
else
{
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();
}
///
/// 删除手机存储都所有缓存功能数据
///
public void DelAllFunctionData()
{
var filePathList = FileUtils.ReadFiles();
foreach (var filePath in filePathList)
{
if (filePath.StartsWith("FunctionData_") && filePath.Length == 13 + 28)
{
FileUtils.DeleteFile(filePath);
}
}
_FunctionList = new FunctionList();
}
///
/// 删除场景
///
public void DeleteScene(Scene scene,bool upSevser)
{
if (upSevser)
{
var pm = new HttpServerRequest();
var packCode = pm.DeleteScene(scene.userSceneId);
if (packCode == StateCode.SUCCESS)
{
FileUtils.DeleteFile(scene.savePath);
List.scenes.Remove(scene);
}
else
{
Utlis.ShowTip(Shared.Language.StringByID(StringId.DeleteSceneFail) + "Code:" + packCode);
}
}
else
{
FileUtils.DeleteFile(scene.savePath);
List.scenes.Remove(scene);
}
}
///
/// 删除本地功能文件
///
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;
}
FileUtils.DeleteFile(delTemp.savePath);
}
bool lockReadFunctionStatus = false;
///
/// 读取全部功能的状态
///
public void ReadAllFunctionStatus()
{
if (lockReadFunctionStatus)
{
MainPage.Log($"多次进入--返回");
return;
}
new Thread(() =>
{
if (lockReadFunctionStatus)
{
MainPage.Log($"多次进入--返回");
return;
}
MainPage.Log($"进入--读取");
lockReadFunctionStatus = true;
try
{
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();
}
}
}