private void SendingEnabledNotifierOnSendingEnabledChanged(bool isSendingEnabled)
        {
            if (isSendingEnabled)
            {
                ReadSettings();
            }
            else
            {
                // independed of ains count in system, zeroing all ains settings in storage:
                _ainSettingsStorageSettable.SetSettings(0, null);
                _ainSettingsStorageSettable.SetSettings(1, null);
                _ainSettingsStorageSettable.SetSettings(2, null);

                _engineSettingsStorageSettable.SetSettings(null);
            }
        }
예제 #2
0
        public void ReadSettingsAsync(bool forceRead, Action <Exception, IEngineSettings> callback)
        {
            // чтение настроек производится только для первого АИН

            if (forceRead == false)
            {
                var settings = _settingsStorageSettable.EngineSettings;
                if (settings != null)
                {
                    _notifyWorker.AddWork(() => callback.Invoke(null, settings));
                    return;
                }
            }

            var sender = _commandSenderHost.Sender;

            if (sender == null)
            {
                throw new NullReferenceException("Порт передачи данных не открыт");
            }

            var readSettingsCmd = new ReadEngineSettingsCommand();

            _notifyWorker.AddWork(FireEventEngineSettingsReadStarted);
            _logger.Log("Чтение настроек двигателя...");
            sender.SendCommandAsync(_targerAddressHost.TargetAddress, readSettingsCmd, _readSettingsTimeout, 2,
                                    (sendException, replyBytes) =>
            {
                if (sendException != null)
                {
                    var errorMessage = "Произошла ошибка во время чтения настрок двигателя";
                    _logger.Log(errorMessage);
                    try
                    {
                        var ex = new Exception(errorMessage, sendException);

                        _notifyWorker.AddWork(() => callback.Invoke(ex, null));
                        _notifyWorker.AddWork(() => FireEventEngineSettingsReadComplete(ex, null));
                        _notifyWorker.AddWork(() => _settingsStorageSettable.SetSettings(null));
                    }
                    catch (Exception)
                    {
                        _logger.Log(
                            "Не удалось совершить обратный вызов после неудачного чтения настроек двигателя (либо не удалось обnullить в хранилище)");
                    }

                    return;
                }

                try
                {
                    var result = readSettingsCmd.GetResult(replyBytes);
                    try
                    {
                        _notifyWorker.AddWork(() => callback.Invoke(null, result));
                        _notifyWorker.AddWork(() => FireEventEngineSettingsReadComplete(null, result));
                        _notifyWorker.AddWork(() => _settingsStorageSettable.SetSettings(result));
                        _logger.Log("Настройки двигателя успешно прочитаны");
                    }
                    catch
                    {
                        _logger.Log(
                            "Не удалось совершить обратный вызов после успешного чтения настроек двигателя (либо не удалось сохранить настройки в хранилище)");
                    }
                }
                catch (Exception resultGetException)
                {
                    var errorMessage = "Ошибка во время разбора ответа на команду чтения настроек двигателя: " +
                                       resultGetException.Message;
                    _logger.Log(errorMessage);
                    try
                    {
                        var ex = new Exception(errorMessage, resultGetException);
                        _notifyWorker.AddWork(() => callback.Invoke(ex, null));
                        _notifyWorker.AddWork(() => FireEventEngineSettingsReadComplete(ex, null));
                        _notifyWorker.AddWork(() => _settingsStorageSettable.SetSettings(null));
                    }
                    catch
                    {
                        _logger.Log(
                            "Не удалось совершить обратный вызов после неудачного парсинга настроек двигателя (либо не удалось обnullить в хранилище)");
                    }
                }
            });
        }
        private void Load()
        {
            var winSystem = new WpfWindowSystem();
            var filename  = winSystem.ShowOpenFileDialog("Импорт настроек", "XML files|*.xml|All files|*.*");

            if (filename != null)
            {
                try
                {
                    var doc         = XDocument.Load(filename);
                    var rootElement = doc.Element("Settings");
                    try
                    {
                        var ainElements = rootElement.Elements("AinSettings");
                        foreach (var ainElement in ainElements)
                        {
                            var zbAinNumber = byte.Parse(ainElement.Attribute("Number").Value);
                            try
                            {
                                _ainSettingsReadNotifyRaisable.RaiseAinSettingsReadStarted(zbAinNumber);

                                var reserved00 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved00").Value);
                                var kpW        = decimal.Parse(TryGetChildElement(ainElement, "KpW").Value,
                                                               CultureInfo.InvariantCulture);
                                var kiW = decimal.Parse(TryGetChildElement(ainElement, "KiW").Value,
                                                        CultureInfo.InvariantCulture);

                                var fiNom = decimal.Parse(TryGetChildElement(ainElement, "FiNom").Value,
                                                          CultureInfo.InvariantCulture);
                                var imax = short.Parse(TryGetChildElement(ainElement, "Imax").Value,
                                                       CultureInfo.InvariantCulture);
                                var udcMax = short.Parse(TryGetChildElement(ainElement, "UdcMax").Value,
                                                         CultureInfo.InvariantCulture);
                                var udcMin = short.Parse(TryGetChildElement(ainElement, "UdcMin").Value,
                                                         CultureInfo.InvariantCulture);
                                var fnom = decimal.Parse(TryGetChildElement(ainElement, "Fnom").Value,
                                                         CultureInfo.InvariantCulture);
                                var fmax = decimal.Parse(TryGetChildElement(ainElement, "Fmax").Value,
                                                         CultureInfo.InvariantCulture);

                                var dflLim = decimal.Parse(TryGetChildElement(ainElement, "DflLim").Value,
                                                           CultureInfo.InvariantCulture);
                                var flMinMin = decimal.Parse(TryGetChildElement(ainElement, "FlMinMin").Value,
                                                             CultureInfo.InvariantCulture);

                                var ioutMax = short.Parse(TryGetChildElement(ainElement, "IoutMax").Value,
                                                          CultureInfo.InvariantCulture);
                                var fiMin = decimal.Parse(TryGetChildElement(ainElement, "FiMin").Value,
                                                          CultureInfo.InvariantCulture);
                                var dacCh = ushort.Parse(TryGetChildElement(ainElement, "DacCh").Value,
                                                         CultureInfo.InvariantCulture);
                                var imcw = ushort.Parse(TryGetChildElement(ainElement, "Imcw").Value,
                                                        CultureInfo.InvariantCulture);
                                var ia0 = short.Parse(TryGetChildElement(ainElement, "Ia0").Value,
                                                      CultureInfo.InvariantCulture);
                                var ib0 = short.Parse(TryGetChildElement(ainElement, "Ib0").Value,
                                                      CultureInfo.InvariantCulture);
                                var ic0 = short.Parse(TryGetChildElement(ainElement, "Ic0").Value,
                                                      CultureInfo.InvariantCulture);
                                var udc0 = short.Parse(TryGetChildElement(ainElement, "Udc0").Value,
                                                       CultureInfo.InvariantCulture);

                                var tauR = decimal.Parse(TryGetChildElement(ainElement, "TauR").Value,
                                                         CultureInfo.InvariantCulture);
                                var lm = decimal.Parse(TryGetChildElement(ainElement, "Lm").Value,
                                                       CultureInfo.InvariantCulture);
                                var lsl = decimal.Parse(TryGetChildElement(ainElement, "Lsl").Value,
                                                        CultureInfo.InvariantCulture);
                                var lrl = decimal.Parse(TryGetChildElement(ainElement, "Lrl").Value,
                                                        CultureInfo.InvariantCulture);
                                var reserved24 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved24").Value);

                                var kpFi = decimal.Parse(TryGetChildElement(ainElement, "KpFi").Value,
                                                         CultureInfo.InvariantCulture);
                                var kiFi = decimal.Parse(TryGetChildElement(ainElement, "KiFi").Value,
                                                         CultureInfo.InvariantCulture);

                                var reserved28 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved28").Value);

                                var kpId = decimal.Parse(TryGetChildElement(ainElement, "KpId").Value,
                                                         CultureInfo.InvariantCulture);
                                var kiId = decimal.Parse(TryGetChildElement(ainElement, "KiId").Value,
                                                         CultureInfo.InvariantCulture);

                                var reserved32 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved32").Value);

                                var kpIq = decimal.Parse(TryGetChildElement(ainElement, "KpIq").Value,
                                                         CultureInfo.InvariantCulture);
                                var kiIq = decimal.Parse(TryGetChildElement(ainElement, "KiIq").Value,
                                                         CultureInfo.InvariantCulture);

                                var accDfDt = decimal.Parse(TryGetChildElement(ainElement, "AccDfDt").Value,
                                                            CultureInfo.InvariantCulture);
                                var decDfDt = decimal.Parse(TryGetChildElement(ainElement, "DecDfDt").Value,
                                                            CultureInfo.InvariantCulture);
                                var unom = decimal.Parse(TryGetChildElement(ainElement, "Unom").Value,
                                                         CultureInfo.InvariantCulture);

                                var tauFlLim = decimal.Parse(TryGetChildElement(ainElement, "TauFlLim").Value,
                                                             CultureInfo.InvariantCulture);

                                var rs = decimal.Parse(TryGetChildElement(ainElement, "Rs").Value,
                                                       CultureInfo.InvariantCulture);
                                var fmin = decimal.Parse(TryGetChildElement(ainElement, "Fmin").Value,
                                                         CultureInfo.InvariantCulture);
                                var tauM = decimal.Parse(TryGetChildElement(ainElement, "TauM").Value,
                                                         CultureInfo.InvariantCulture);
                                var tauF = decimal.Parse(TryGetChildElement(ainElement, "TauF").Value,
                                                         CultureInfo.InvariantCulture);
                                var tauFSet = decimal.Parse(TryGetChildElement(ainElement, "TauFSet").Value,
                                                            CultureInfo.InvariantCulture);
                                var tauFi = decimal.Parse(TryGetChildElement(ainElement, "TauFi").Value,
                                                          CultureInfo.InvariantCulture);
                                var idSetMin = short.Parse(TryGetChildElement(ainElement, "IdSetMin").Value,
                                                           CultureInfo.InvariantCulture);
                                var idSetMax = short.Parse(TryGetChildElement(ainElement, "IdSetMax").Value,
                                                           CultureInfo.InvariantCulture);
                                var uchMin = BytesPair.Parse(TryGetChildElement(ainElement, "UchMin").Value);
                                var uchMax = BytesPair.Parse(TryGetChildElement(ainElement, "UchMax").Value);

                                var reserved50 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved50").Value);
                                var reserved51 = BytesPair.Parse(TryGetChildElement(ainElement, "Reserved51").Value);

                                var np = int.Parse(TryGetChildElement(ainElement, "Np").Value,
                                                   CultureInfo.InvariantCulture);
                                var nimpFloorCode = int.Parse(TryGetChildElement(ainElement, "NimpFloorCode").Value,
                                                              CultureInfo.InvariantCulture);
                                var fanMode = AinTelemetryFanWorkmodeExtensions.FromIoBits(
                                    int.Parse(TryGetChildElement(ainElement, "FanMode").Value,
                                              CultureInfo.InvariantCulture));
                                var directCurrentMagnetization =
                                    bool.Parse(TryGetChildElement(ainElement, "DirectCurrentMagnetization").Value);

                                var umodThr = decimal.Parse(TryGetChildElement(ainElement, "UmodThr").Value,
                                                            CultureInfo.InvariantCulture);

                                var emdecDfdt = decimal.Parse(TryGetChildElement(ainElement, "EmdecDfdt").Value,
                                                              CultureInfo.InvariantCulture);

                                var textMax = short.Parse(TryGetChildElement(ainElement, "TextMax").Value,
                                                          CultureInfo.InvariantCulture);
                                var toHl = short.Parse(TryGetChildElement(ainElement, "ToHl").Value,
                                                       CultureInfo.InvariantCulture);
                                var ain1LinkFault = bool.Parse(TryGetChildElement(ainElement, "Ain1LinkFault").Value);
                                var ain2LinkFault = bool.Parse(TryGetChildElement(ainElement, "Ain2LinkFault").Value);
                                var ain3LinkFault = bool.Parse(TryGetChildElement(ainElement, "Ain3LinkFault").Value);


                                var setting = new AinSettingsSimple(reserved00, kpW, kiW, fiNom, imax, udcMax, udcMin,
                                                                    fnom, fmax, dflLim, flMinMin, ioutMax, fiMin, dacCh, imcw, ia0, ib0, ic0, udc0,
                                                                    tauR, lm, lsl, lrl, reserved24, kpFi, kiFi, reserved28, kpId, kiId, reserved32,
                                                                    kpIq, kiIq, accDfDt, decDfDt, unom, tauFlLim, rs, fmin, tauM, tauF, tauFSet, tauFi,
                                                                    idSetMin, idSetMax, uchMin, uchMax, reserved50, reserved51, np, nimpFloorCode,
                                                                    fanMode, directCurrentMagnetization, umodThr, emdecDfdt, textMax, toHl,
                                                                    ain1LinkFault, ain2LinkFault, ain3LinkFault);
                                _ainSettingsStorageSettable.SetSettings(zbAinNumber, setting);
                                _ainSettingsReadNotifyRaisable.RaiseAinSettingsReadComplete(zbAinNumber, null,
                                                                                            setting); // TODO: try catch real exception
                                _debugLogger.GetLogger(5).Log("Настройки №" + zbAinNumber + " успешно импортированы",
                                                              new StackTrace(true));
                            }
                            catch (Exception e)
                            {
                                _debugLogger.GetLogger(1)
                                .Log(
                                    "Не удалось импортировать настройки АИН№" + zbAinNumber + Environment.NewLine +
                                    e, new StackTrace(e, true));
                            }
                        }
                    }
                    catch (Exception exx)
                    {
                        _debugLogger.GetLogger(1)
                        .Log("Не удалось импортировать настройки АИН" + Environment.NewLine + exx,
                             new StackTrace(exx, true));
                    }

                    var engineSettingsElement = rootElement.Element("EngineSettings");
                    if (engineSettingsElement != null)
                    {
                        try
                        {
                            var settings = new EngineSettingsSimple
                            {
                                Inom = ushort.Parse(TryGetChildElement(engineSettingsElement, "Inom").Value,
                                                    CultureInfo.InvariantCulture),
                                Nnom = ushort.Parse(TryGetChildElement(engineSettingsElement, "Nnom").Value,
                                                    CultureInfo.InvariantCulture),
                                Nmax = ushort.Parse(TryGetChildElement(engineSettingsElement, "Nmax").Value,
                                                    CultureInfo.InvariantCulture),
                                Pnom = decimal.Parse(TryGetChildElement(engineSettingsElement, "Pnom").Value,
                                                     CultureInfo.InvariantCulture),
                                CosFi = decimal.Parse(TryGetChildElement(engineSettingsElement, "CosFi").Value,
                                                      CultureInfo.InvariantCulture),
                                Eff = decimal.Parse(TryGetChildElement(engineSettingsElement, "Eff").Value,
                                                    CultureInfo.InvariantCulture),
                                Mass = ushort.Parse(TryGetChildElement(engineSettingsElement, "Mass").Value,
                                                    CultureInfo.InvariantCulture),
                                MmM = ushort.Parse(TryGetChildElement(engineSettingsElement, "MmM").Value,
                                                   CultureInfo.InvariantCulture),
                                Height = ushort.Parse(TryGetChildElement(engineSettingsElement, "Height").Value,
                                                      CultureInfo.InvariantCulture),
                                I2Tmax = uint.Parse(TryGetChildElement(engineSettingsElement, "I2Tmax").Value,
                                                    CultureInfo.InvariantCulture),
                                Icontinious =
                                    ushort.Parse(TryGetChildElement(engineSettingsElement, "Icontinious").Value,
                                                 CultureInfo.InvariantCulture),
                                ZeroF = ushort.Parse(TryGetChildElement(engineSettingsElement, "ZeroF").Value,
                                                     CultureInfo.InvariantCulture)
                            };
                            _engineSettingsStorageSettable.SetSettings(settings);
                            _engineSettingsReadNotifyRaisable.RaiseEngineSettingsReadComplete(null, settings);
                            _debugLogger.GetLogger(5).Log("Настройки двигателя успешно импортированы",
                                                          new StackTrace(true));
                        }
                        catch (Exception ex)
                        {
                            _debugLogger.GetLogger(1)
                            .Log("Не удалось импортировать настройки двигателя" + Environment.NewLine + ex,
                                 new StackTrace(ex, true));
                            throw;
                        }
                    }
                }
                catch (Exception ex)
                {
                    _debugLogger.GetLogger(1)
                    .Log("Не удалось импортировать настройки из " + filename + Environment.NewLine + ex,
                         new StackTrace(ex, true));
                    throw;
                }
            }
        }