Exemplo n.º 1
0
 /// <summary>
 /// Отправить на устройство исходящее событие
 /// </summary>
 /// <param name="outgoingEvent">Событие</param>
 static private void PostOutgoingSearchEvent(ControlEventBase outgoingEvent)
 {
     foreach (var hardware in Hardwares)
     {
         hardware.PostOutgoingEvent(outgoingEvent);
     }
 }
Exemplo n.º 2
0
        protected override void OnNewControlEvent(ControlEventBase controlEvent)
        {
            var relativePosition   = CalculateRelativeAxisPosition(AxisDefaultRange.GetAxisDefaultMinimum(), AxisDefaultRange.GetAxisDefaultMaximum(), controlEvent);
            var positionPercentage = GetPercent(relativePosition, _axisMinimum, _axisMaximum);

            AccessDescriptor.SetPositionInPercents(positionPercentage);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Прекратить поиск
        /// </summary>
        public static void StopComponentSearch()
        {
            if (string.IsNullOrEmpty(_contolInSearchGuid))
            {
                return;
            }
            ControlEventBase ev = null;

            if (SoftDumpCache.ContainsKey(_contolInSearchGuid))
            {
                ev = SoftDumpCache[_contolInSearchGuid];
            }
            if (ev == null)
            {
                var hardware = ControlProcessorHardware.GenerateByGuid(_contolInSearchGuid);
                if (hardware.ModuleType == HardwareModuleType.BinaryOutput)
                {
                    ev = new LampEvent
                    {
                        Hardware = hardware,
                        IsOn     = false
                    };
                }
                if (hardware.ModuleType == HardwareModuleType.Indicator || hardware.ModuleType == HardwareModuleType.LedMatrixIndicator)
                {
                    ev = new IndicatorEvent
                    {
                        Hardware      = hardware,
                        IndicatorText = "       "
                    };
                }
            }
            PostOutgoingSearchEvent(ev);
            _contolInSearchGuid = string.Empty;
        }
Exemplo n.º 4
0
 /// <summary>
 /// Отправить железу событие
 /// </summary>
 /// <param name="outgoingEvent">описание исходящего события</param>
 public void PostOutgoingEvent(ControlEventBase outgoingEvent)
 {
     lock (_outgoingEvents)
     {
         _outgoingEvents.Enqueue(outgoingEvent);
     }
 }
Exemplo n.º 5
0
 public override void PostOutgoingEvent(ControlEventBase outgoingEvent)
 {
     if (Devices.ContainsKey(outgoingEvent.Hardware.MotherBoardId))
     {
         Devices[outgoingEvent.Hardware.MotherBoardId].PostOutgoingEvent(outgoingEvent);
     }
 }
Exemplo n.º 6
0
        /// <summary>
        /// Функция обрабатывает нажатие кнопки или кручение энкодера
        /// Для того, чтобы корректно обрабатывать галетники, функция реагирует преимущестенно на состояние "включено"
        /// </summary>
        /// <param name="controlEvent">Структура, описывающая произошедшее событие</param>
        public void OnNewControlEvent(ControlEventBase controlEvent)
        {
            // Если событие не соответствует контролу, указанному в AccessDescriptor, то игнорируем его
            if (controlEvent.Hardware.ModuleType != _hardwareSupported)
            {
                return;
            }
            var ev = controlEvent as ButtonEvent;

            if (ev == null)
            {
                return;
            }
            var found = false;

            foreach (var item in _activeButtonsList)
            {
                if (item.Key != controlEvent.Hardware.GetHardwareGuid())
                {
                    continue;
                }
                _activeButtonsList[item.Key] = ev.IsPressed;
                found = true;
                break;
            }
            if (!found && _initializationModeOn)
            {
                _activeButtonsList.Add(controlEvent.Hardware.GetHardwareGuid(), ev.IsPressed);
            }
            _allActiveButtons.ItemsSource = FillActiveButtonGrid();
        }
        protected override bool IsControlEventSuitable(ControlEventBase controlEvent)
        {
            var ev = controlEvent as ButtonEvent;

            if (ev == null)
            {
                return(false);
            }

            if (controlEvent.IsSoftDumpEvent)
            {
                return(false);
            }
            // AD при изменении состава State'ов нотифицирует об этом CP
            // Проверить, существует ли всё ещё такой ID контрола в AccessDescriptor
            // Как получить все состояния при загрузке ControlProcessor? Вызвать функцию в AccessDescriptor?
            var hardwareId = controlEvent.Hardware.GetHardwareGuid();
            var button     = Connections.FirstOrDefault(hw => hw.GetAssignedHardware() == hardwareId);

            if (button == null)
            {
                return(false);
            }
            return(true);
        }
        protected override void OnNewControlEvent(ControlEventBase controlEvent)
        {
            var ev = (ButtonEvent)controlEvent;

            // AD при изменении состава State'ов нотифицирует об этом CP
            // Проверить, существует ли всё ещё такой ID контрола в AccessDescriptor
            // Как получить все состояния при загрузке ControlProcessor? Вызвать функцию в AccessDescriptor?
            var hardwareId = controlEvent.Hardware.GetHardwareGuid();
            var button     = Connections.FirstOrDefault(hw => hw.GetAssignedHardware() == hardwareId);

            var direction = button.GetInverseState() ? !ev.IsPressed : ev.IsPressed;

            if (!direction)
            {
                SetRepeaterState(LastState.None);
                return;
            }

            if (button.GetConnector().Id == 1)
            {
                AccessDescriptor.SetNextState(1);
                SetRepeaterState(LastState.Next);
            }

            else
            {
                AccessDescriptor.SetPreviousState(1);
                SetRepeaterState(LastState.Prev);
            }
        }
Exemplo n.º 9
0
        protected override void OnNewControlEvent(ControlEventBase controlEvent)
        {
            var ev = (ButtonEvent)controlEvent;

            var hw = controlEvent.Hardware.GetHardwareGuid();

            // Если такое железо не назначено - прекращаем обработку
            if (!_usedHardware.ContainsKey(hw))
            {
                return;
            }

            _usedHardware[hw] = ev.IsPressed;

            if (!((DescriptorBase)AccessDescriptor).IsPowerOn())
            {
                return;
            }

            var stateId = GetActivatedStateId();

            if (stateId != -1)
            {
                AccessDescriptor.SetState(stateId);
            }
            else
            {
                AccessDescriptor.SetDefaultState();
            }
        }
Exemplo n.º 10
0
 /// <summary>
 /// Отправить на устройство исходящее событие
 /// </summary>
 /// <param name="outgoingEvent">Событие</param>
 static public void PostOutgoingEvent(ControlEventBase outgoingEvent)
 {
     if (outgoingEvent.Hardware.GetHardwareGuid() == _contolInSearchGuid)
     {
         return;
     }
     SoftDumpCache[outgoingEvent.Hardware.GetHardwareGuid()] = outgoingEvent;
     foreach (var hardware in Hardwares)
     {
         hardware.PostOutgoingEvent(outgoingEvent);
     }
 }
Exemplo n.º 11
0
        /// <summary>
        /// Дамп всех клавиш
        /// </summary>
        /// <param name="allHardwareInUse">массив содержит упоминание всех модулей, которые нужно сдампить</param>
        public void Dump(ControlProcessorHardware[] allHardwareInUse)
        {
            // Если не сделать эту задержку, то дамп может не произойти. Почему - не понятно.
            Thread.Sleep(1000);
            var dumpEvents = new ControlEventBase[1];
            var dumpEvent  = new DumpEvent {
                Hardware = allHardwareInUse[0]
            };

            dumpEvents[0] = dumpEvent;
            PostOutgoingEvents(dumpEvents);
            System.Diagnostics.Debug.Print("Dump: " + MotherboardId);
        }
Exemplo n.º 12
0
 public void Tick()
 {
     if (IsNeedToRepeatControlEventOnPowerOn() && _lastTimePowerWasOff)
     {
         if ((AccessDescriptor as DescriptorBase).IsPowerOn())
         {
             ProcessControlEvent(_lastControlEvent);
             _lastTimePowerWasOff = false;
             _lastControlEvent    = null;
         }
     }
     OnTick();
 }
Exemplo n.º 13
0
 public void SendEvent(ControlEventBase controlEvent)
 {
     lock (_storage)
     {
         foreach (var cp in _storage)
         {
             if (cp.Value is IVisualizer)
             {
                 continue;
             }
             ((ICollector)cp.Value).ProcessControlEvent(controlEvent);
         }
     }
 }
        /// <summary>
        /// Функция обрабатывает нажатие кнопки или кручение энкодера
        /// Для того, чтобы корректно обрабатывать галетники, функция реагирует преимущестенно на состояние "включено"
        /// </summary>
        /// <param name="controlEvent">Структура, описывающая произошедшее событие</param>
        public void OnNewControlEvent(ControlEventBase controlEvent)
        {
            var ev = controlEvent as AxisEvent;

            if (ev == null)
            {
                return;
            }
            var axisControlProcessor = _assignedControlProcessor as AxisRangeProcessor;

            if (axisControlProcessor == null)
            {
                return;
            }

            if (!_axisDebouncer.IsNeedToProcessAxisEvent(ev, 10))
            {
                return;
            }

            // Приводим 0-1023 arcc к 0-1000 роутера
            var position = axisControlProcessor.CalculateRelativeAxisPosition(AxisDefaultRange.GetAxisDefaultMinimum(), AxisDefaultRange.GetAxisDefaultMaximum(), controlEvent);

            if (_initializationModeOn)
            {
                if (position < _axisMinimum)
                {
                    _axisMinimum = position;
                    ShowData();
                }
                if (position > _axisMaximum)
                {
                    _axisMaximum = position;
                    ShowData();
                }
            }
            else
            {
                if (position < _axisMinimum)
                {
                    position = _axisMinimum;
                }
                if (position > _axisMaximum)
                {
                    position = _axisMaximum;
                }
            }
            _axisCurrentPosition.Value = position;
        }
Exemplo n.º 15
0
        protected override void OnNewControlEvent(ControlEventBase controlEvent)
        {
            var ev = controlEvent as EncoderEvent;

            var direction = Connections[0].GetInverseState() ? !ev.RotateDirection : ev.RotateDirection;

            if (direction)
            {
                AccessDescriptor.SetNextState(ev.ClicksCount);
            }
            else
            {
                AccessDescriptor.SetPreviousState(ev.ClicksCount);
            }
        }
Exemplo n.º 16
0
        protected override bool IsControlEventSuitable(ControlEventBase controlEvent)
        {
            var ev = controlEvent as EncoderEvent;

            if (ev == null)
            {
                return(false);
            }

            if (controlEvent.Hardware.GetHardwareGuid() != Connections[0].GetAssignedHardware())
            {
                return(false);
            }
            return(true);
        }
Exemplo n.º 17
0
        public void ProcessControlEvent(ControlEventBase controlEvent)
        {
            if (!IsControlEventSuitable(controlEvent))
            {
                return;
            }

            _lastControlEvent = controlEvent;
            if (!(AccessDescriptor as DescriptorBase).IsPowerOn())
            {
                _lastTimePowerWasOff = true;
                return;
            }
            OnNewControlEvent(controlEvent);
        }
 /// <summary>
 /// Преобразовать исходящее событие в массив данных, готовый к передаче железу ARCC через COM-порт
 /// </summary>
 /// <param name="ev">исходящее событие роутера (зажечь/погасить лампу, вывести данные на индикатор, ...)</param>
 /// <returns>массив байт, готовый к передаче железу ARCC через COM-порт</returns>
 public byte[] ConvertEventToByteArrayForHardware(ControlEventBase ev)
 {
     byte[] outDataBuffer = null;
     // Отправка события включить линию модуля бинарного вывода
     if (ev.Hardware.ModuleType == HardwareModuleType.BinaryOutput && ev is LampEvent)
     {
         var hEvent = ev as LampEvent;
         outDataBuffer    = new byte[5];
         outDataBuffer[0] = (byte)ArccModuleType.LinearOutput;
         outDataBuffer[1] = (byte)ev.Hardware.ModuleId;
         outDataBuffer[2] = (byte)ArccLinearOutputCommand.SetLampState;
         outDataBuffer[3] = (byte)ev.Hardware.ControlId;
         outDataBuffer[4] = (byte)(hEvent.IsOn ? 1 : 0);
     }
     // Отправка события установить на индикаторе текст
     // ToDo: костыль, чтобы работал поиск: ev.Hardware.ControlId != 0
     if (ev.Hardware.ModuleType == HardwareModuleType.Indicator && ev is IndicatorEvent && ev.Hardware.ControlId == 0)
     {
         var hEvent = ev as IndicatorEvent;
         // Размер буфера - 10 байт
         outDataBuffer    = StringToIndicatorBuffer(hEvent.IndicatorText);
         outDataBuffer[0] = (byte)ArccModuleType.Indicator;
         outDataBuffer[1] = (byte)ev.Hardware.ModuleId;
         outDataBuffer[2] = (byte)ArccIndicatorCommand.SetText;
     }
     // Отправка события сдампить состояние кнопок модуля клавиатуры
     if (ev.Hardware.ModuleType == HardwareModuleType.Button && ev is DumpEvent)
     {
         outDataBuffer    = new byte[5];
         outDataBuffer[0] = (byte)ArccModuleType.Button;
         outDataBuffer[1] = (byte)ev.Hardware.ModuleId;
         outDataBuffer[2] = (byte)ArccButtonCommand.DumpAllKeys;//command;
         outDataBuffer[3] = 0;
         outDataBuffer[4] = 0;
     }
     // Отправка события сдампить состояние кнопок модуля бинарного ввода
     if (ev.Hardware.ModuleType == HardwareModuleType.Button && ev is DumpEvent && ev.Hardware.ModuleId > 255)
     {
         outDataBuffer    = new byte[5];
         outDataBuffer[0] = (byte)ArccModuleType.BinaryInput;          // 8 - Группа модулей бинарного ввода. Всегда дампим вместе с клавишами,
         outDataBuffer[1] = (byte)(ev.Hardware.ModuleId - IncreaseModuleIdForBinaryInput);
         outDataBuffer[2] = (byte)ArccBinaryInputCommand.DumpAllLines; // 1- настройка фильтра, 2 - дамп
         outDataBuffer[3] = 0;
         outDataBuffer[4] = 0;
     }
     return(outDataBuffer);
 }
Exemplo n.º 19
0
        protected override void OnNewControlEvent(ControlEventBase controlEvent)
        {
            var ev = controlEvent as ButtonEvent;

            var hardwareId = controlEvent.Hardware.GetHardwareGuid();
            var button     = (AssignmentForButton)Connections.FirstOrDefault(hw => hw.GetAssignedHardware() == hardwareId);

            var direction = button.GetInverseState() ? !ev.IsPressed : ev.IsPressed;

            if (_emulateToggle)
            {
                var action = button.Toggle(direction);
                if (action == ToggleState.MakeOn)
                {
                    AccessDescriptor.SetState(button.GetConnector().Id);
                    _lastStateId = button.GetConnector().Id;
                    button.IsOn  = true;
                }

                if (action == ToggleState.MakeOff)
                {
                    button.IsOn = false;
                }
            }
            else
            {
                if (direction)
                {
                    AccessDescriptor.SetState(button.GetConnector().Id);
                    _lastStateId = button.GetConnector().Id;
                    button.IsOn  = true;
                }
                else
                {
                    button.IsOn  = false;
                    _lastStateId = -1;
                }
            }
            // Для дампа кнопок с первого раза (без AllKeys, затем PressedKeysOnly) нужно игнорировать события отжатых кнопок, если одна из кнопок уже нажата
            if (Connections.Any(bi => ((AssignmentForButton)bi).IsOn))
            {
                return;
            }
            _lastStateId = -1;
            AccessDescriptor.SetDefaultState();
        }
Exemplo n.º 20
0
 /// <summary>
 /// Функция обрабатывает нажатие кнопки или кручение энкодера
 /// Для того, чтобы корректно обрабатывать галетники, функция реагирует преимущестенно на состояние "включено"
 /// </summary>
 /// <param name="controlEvent">Структура, описывающая произошедшее событие</param>
 public void OnNewControlEvent(ControlEventBase controlEvent)
 {
     // Если событие не соответствует контролу, указанному в AccessDescriptor, то игнорируем его
     if (controlEvent.Hardware.ModuleType != _hardwareSupported)
     {
         return;
     }
     if (_hardwareSupported == HardwareModuleType.Button)
     {
         if (!((ButtonEvent)controlEvent).IsPressed)
         {
             return;
         }
         _direction.Text = ((ButtonEvent)controlEvent).IsPressed ? "^^^" : "vvv";
     }
     if (_hardwareSupported == HardwareModuleType.Encoder)
     {
         _direction.Text = ((EncoderEvent)controlEvent).RotateDirection ? ">>>" : "<<<";
     }
     _hardware.Text = controlEvent.Hardware.GetHardwareGuid();
 }
Exemplo n.º 21
0
        public int CalculateRelativeAxisPosition(int minimum, int maximum, ControlEventBase controlEvent)
        {
            var ev = (AxisEvent)controlEvent;

            double relativeEventPosition = ev.Position;

            if (ev.Position > ev.MaximumValue)
            {
                relativeEventPosition = ev.MaximumValue;
            }
            if (ev.Position < ev.MinimumValue)
            {
                relativeEventPosition = ev.MinimumValue;
            }
            relativeEventPosition = relativeEventPosition - ev.MinimumValue;
            var relativeEventRange = ev.MaximumValue - ev.MinimumValue;

            var relativeResultRange = maximum - minimum;

            var relativeResultPosition = (int)(relativeResultRange / relativeEventRange * relativeEventPosition);

            return(relativeResultPosition);
        }
Exemplo n.º 22
0
 /// <summary>
 /// Функция обрабатывает нажатие кнопки или кручение энкодера
 /// Для того, чтобы корректно обрабатывать галетники, функция реагирует преимущестенно на состояние "включено"
 /// </summary>
 /// <param name="controlEvent">Структура, описывающая произошедшее событие</param>
 public void OnNewControlEvent(ControlEventBase controlEvent)
 {
 }
Exemplo n.º 23
0
 /// <summary>
 ///     Отправить на устройство исходящее событие
 /// </summary>
 /// <param name="outgoingEvent">Событие</param>
 public abstract void PostOutgoingEvent(ControlEventBase outgoingEvent);
Exemplo n.º 24
0
 protected abstract void OnNewControlEvent(ControlEventBase controlEvent);
Exemplo n.º 25
0
 protected abstract bool IsControlEventSuitable(ControlEventBase controlEvent);
Exemplo n.º 26
0
        protected override bool IsControlEventSuitable(ControlEventBase controlEvent)
        {
            var ev = controlEvent as ButtonEvent;

            return(ev != null);
        }
Exemplo n.º 27
0
 public override void PostOutgoingEvent(ControlEventBase outgoingEvent)
 {
 }
Exemplo n.º 28
0
 public void PostOutgoingEvent(ControlEventBase outgoingEvent)
 {
 }