예제 #1
0
		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;
		}
예제 #2
0
        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();
        }
예제 #3
0
 /// <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);
     }
 }
예제 #4
0
        /// <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();
        }
예제 #5
0
 protected virtual void OnDataSavedToNetworkEvent(Dictionary<string, string> values, bool success)
 {
     var handler = DataSavedToNetworkEvent;
     if (handler != null) handler(values, success);
 }
예제 #6
0
 protected virtual void OnDataReceivedFromNetworkEvent(Dictionary<string, string> values)
 {
     var handler = DataReceivedFromNetworkEvent;
     if (handler != null) handler(values);
 }
예제 #7
0
 public void SaveDataToNetwork(Dictionary<string, string> values)
 {
     OnDataReceivedFromClientEvent(values);
 }
예제 #8
0
 public void DataSavedToNetwork(Dictionary<string, string> values, bool success)
 {
     OnDataSavedToNetworkEvent(values, success);
 }
예제 #9
0
 public void DataReceivedFromNetwork(Dictionary<string, string> values)
 {
     OnDataReceivedFromNetworkEvent(values);
 }
예제 #10
0
 partial void DeleteDictionary(Dictionary instance);
예제 #11
0
 partial void UpdateDictionary(Dictionary instance);
예제 #12
0
 partial void InsertDictionary(Dictionary instance);
예제 #13
0
		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;
		}