/// <summary> /// Отправить на устройство исходящее событие /// </summary> /// <param name="outgoingEvent">Событие</param> static private void PostOutgoingSearchEvent(ControlEventBase outgoingEvent) { foreach (var hardware in Hardwares) { hardware.PostOutgoingEvent(outgoingEvent); } }
protected override void OnNewControlEvent(ControlEventBase controlEvent) { var relativePosition = CalculateRelativeAxisPosition(AxisDefaultRange.GetAxisDefaultMinimum(), AxisDefaultRange.GetAxisDefaultMaximum(), controlEvent); var positionPercentage = GetPercent(relativePosition, _axisMinimum, _axisMaximum); AccessDescriptor.SetPositionInPercents(positionPercentage); }
/// <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; }
/// <summary> /// Отправить железу событие /// </summary> /// <param name="outgoingEvent">описание исходящего события</param> public void PostOutgoingEvent(ControlEventBase outgoingEvent) { lock (_outgoingEvents) { _outgoingEvents.Enqueue(outgoingEvent); } }
public override void PostOutgoingEvent(ControlEventBase outgoingEvent) { if (Devices.ContainsKey(outgoingEvent.Hardware.MotherBoardId)) { Devices[outgoingEvent.Hardware.MotherBoardId].PostOutgoingEvent(outgoingEvent); } }
/// <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); } }
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(); } }
/// <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); } }
/// <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); }
public void Tick() { if (IsNeedToRepeatControlEventOnPowerOn() && _lastTimePowerWasOff) { if ((AccessDescriptor as DescriptorBase).IsPowerOn()) { ProcessControlEvent(_lastControlEvent); _lastTimePowerWasOff = false; _lastControlEvent = null; } } OnTick(); }
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; }
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); } }
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); }
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); }
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(); }
/// <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(); }
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); }
/// <summary> /// Функция обрабатывает нажатие кнопки или кручение энкодера /// Для того, чтобы корректно обрабатывать галетники, функция реагирует преимущестенно на состояние "включено" /// </summary> /// <param name="controlEvent">Структура, описывающая произошедшее событие</param> public void OnNewControlEvent(ControlEventBase controlEvent) { }
/// <summary> /// Отправить на устройство исходящее событие /// </summary> /// <param name="outgoingEvent">Событие</param> public abstract void PostOutgoingEvent(ControlEventBase outgoingEvent);
protected abstract void OnNewControlEvent(ControlEventBase controlEvent);
protected abstract bool IsControlEventSuitable(ControlEventBase controlEvent);
protected override bool IsControlEventSuitable(ControlEventBase controlEvent) { var ev = controlEvent as ButtonEvent; return(ev != null); }
public override void PostOutgoingEvent(ControlEventBase outgoingEvent) { }
public void PostOutgoingEvent(ControlEventBase outgoingEvent) { }