public Dictionary<Property, ScheduleClass> GetSchedulesForControlledObjects(List<Property> controlledObjects) { var res = new Dictionary<Property, ScheduleClass>(); foreach (var controlledObject in controlledObjects) { foreach (var scheduleClass in Schedules) { if (scheduleClass.ControlledObjects.Contains(controlledObject)) { if (!res.ContainsKey(controlledObject)) res.Add(controlledObject, scheduleClass); break; } } if (!res.ContainsKey(controlledObject)) res.Add(controlledObject, new ScheduleClass(true)); } return res; }
public DataManager(IUnityContainer container) { // подписываемся на событие обновления планов через редактор var eventAggregator = container.Resolve<EventAggregator>(); var eve = eventAggregator.GetEvent<PlansModifiedEvent>(); eve.Subscribe(OnPlansModified); // инициализируем переменные _addresses = new Dictionary<string, List<Property>>(); _planObjects = new Dictionary<int, BaseObject>(); _providers = new List<IDataProvider>(); _changedValues = new List<BaseObject>(); _pushValuesToClientTimer = new Timer(PushValuesInterval) { AutoReset = true }; _pushValuesToClientTimer.Elapsed += PushValuesToClientTimerOnElapsed; using (var plansDb = new PlansDc(_esterConnectionString)) { // получаем необходимые значения из бд _rootObjects = plansDb.PlanObjects.Where(po => po.Parent == null).Select(p => ServerExtensions.FromDbObject(p)).ToList(); foreach (var group in plansDb.Properties.GroupBy(g => g.Path)) _addresses.Add(group.Key, group.ToList()); } FillPlanObjects(_planObjects, _rootObjects); // Регистрируем все имеющиеся провайдеры данных RegisterDataProviders(); // формируем конфигурацию для провайдеров данных var config = new Dictionary<string, object> { { "ConfigSource", new XmlConfigSource(Path.Combine(HttpRuntime.AppDomainAppPath, @"Resources\ServerConfig.xml")) { AutoSave = true } }, { "Addresses", _addresses.Keys.ToList() } }; // инициализируем провайдеры foreach (var dataProvider in _providers) { dataProvider.DataProviderInitializedEvent += OnDataProviderInitializedEvent; dataProvider.Initialize(config); } // запускаем таймер _pushValuesToClientTimer.Start(); }
/// <summary> /// Записать значения в сеть контроллеров /// </summary> /// <param name="values">Ключ - адрес в сети, значение - значение по адресу</param> private void SaveToNetwork(Dictionary<string, string> values) { foreach (var dataProvider in _providers.Where(p => p.State == DataProviderState.Working)) { dataProvider.SaveValuesToNetwork(values); } }
/// <summary> /// Обработка поступивших от провайдеров значений /// </summary> /// <param name="values">Ключ - адрес в сети, значение - значение по адресу</param> private void NetworkOnDataRecievedEvent(Dictionary<string, string> values) { foreach (var value in values) { // log event var myEvent = new LogEventInfo(LogLevel.Info, "BAChistory", ""); myEvent.Properties.Add("address", value.Key); myEvent.Properties.Add("value", value); LogManager.GetCurrentClassLogger().Log(myEvent); if (_addresses.ContainsKey(value.Key)) // обновляем значения на всех объектах, для которых прописан данный адрес foreach (var dbAddress in _addresses[value.Key]) { if (!_planObjects.ContainsKey(dbAddress.ObjectId)) continue; var doubleValue = double.Parse(value.Value); _planObjects[dbAddress.ObjectId].Update((PropertyTypes)dbAddress.AddressTypeId, doubleValue); // если список обновленных значений еще не содержит этот объект, добавляем его if (!_changedValues.Contains(_planObjects[dbAddress.ObjectId])) _changedValues.Add(_planObjects[dbAddress.ObjectId]); } } if (_changedValues.Count >= 100) // скопилось достаточно много данных, отправим-ка их клиенту PushValuesToClients(); }
protected virtual void OnDataSavedToNetworkEvent(Dictionary<string, string> values, bool success) { var handler = DataSavedToNetworkEvent; if (handler != null) handler(values, success); }
protected virtual void OnDataReceivedFromNetworkEvent(Dictionary<string, string> values) { var handler = DataReceivedFromNetworkEvent; if (handler != null) handler(values); }
public void SaveDataToNetwork(Dictionary<string, string> values) { OnDataReceivedFromClientEvent(values); }
public void DataSavedToNetwork(Dictionary<string, string> values, bool success) { OnDataSavedToNetworkEvent(values, success); }
public void DataReceivedFromNetwork(Dictionary<string, string> values) { OnDataReceivedFromNetworkEvent(values); }
partial void DeleteDictionary(Dictionary instance);
partial void UpdateDictionary(Dictionary instance);
partial void InsertDictionary(Dictionary instance);
private Dictionary<uint, List<string>> GenerateControlledObjectForEachController(ScheduleClass sch) { var controlledObjectsForEachController = new Dictionary<uint, List<string>>(); //foreach (var controlledObject in sch.ControlledObjects) //{ // var tmp = controlledObject.Split('.')[0]; // uint controller; // if (uint.TryParse(tmp, out controller)) // { // var obj = controlledObject.Split('.')[1]; // if (controlledObjectsForEachController.ContainsKey(controller)) // controlledObjectsForEachController[controller].Add(obj); // else // controlledObjectsForEachController.Add(controller, new List<string> { obj }); // } //} return controlledObjectsForEachController; }